From c2670e4afb0d5eca9495796e1ef69cc807bb87ed Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Tue, 18 Jul 2023 20:06:45 +0200 Subject: [PATCH 001/150] Set version to 0.8.22 --- CMakeLists.txt | 2 +- Changelog.md | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6583f7cd4742..51f1511ce606 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ include(EthPolicy) eth_policy() # project name and version should be set after cmake_policy CMP0048 -set(PROJECT_VERSION "0.8.21") +set(PROJECT_VERSION "0.8.22") # OSX target needed in order to support std::visit set(CMAKE_OSX_DEPLOYMENT_TARGET "10.14") project(solidity VERSION ${PROJECT_VERSION} LANGUAGES C CXX) diff --git a/Changelog.md b/Changelog.md index a86b6d58b8b8..4205e7416b4c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,14 @@ +### 0.8.22 (unreleased) + +Language Features: + + +Compiler Features: + + +Bugfixes: + + ### 0.8.21 (2023-07-19) Important Bugfixes: From b2ce8898eadf105f346a7e7bb94b61078411ad4c Mon Sep 17 00:00:00 2001 From: r0qs Date: Wed, 19 Jul 2023 12:18:26 +0200 Subject: [PATCH 002/150] Update solidity-website links in release checklist --- ReleaseChecklist.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ReleaseChecklist.md b/ReleaseChecklist.md index 8892566820cd..2d94281bb07f 100644 --- a/ReleaseChecklist.md +++ b/ReleaseChecklist.md @@ -3,7 +3,7 @@ ### Requirements - [ ] GitHub account with access to [solidity](https://github.com/ethereum/solidity), [solc-js](https://github.com/ethereum/solc-js), [solc-bin](https://github.com/ethereum/solc-bin), [homebrew-ethereum](https://github.com/ethereum/homebrew-ethereum), - [solidity-blog](https://github.com/ethereum/solidity-blog) and [solidity-portal](https://github.com/ethereum/solidity-portal) repositories. + [solidity-website](https://github.com/ethereum/solidity-website). - [ ] DockerHub account with push rights to the [``solc`` image](https://hub.docker.com/r/ethereum/solc). - [ ] Lauchpad (Ubuntu One) account with a membership in the ["Ethereum" team](https://launchpad.net/~ethereum) and a gnupg key for your email in the ``ethereum.org`` domain (has to be version 1, gpg2 won't work). @@ -37,8 +37,8 @@ At least a day before the release: - [ ] Prepare drafts of Twitter, Reddit and Solidity Forum announcements. ### Blog Post - - [ ] Create a post on [solidity-blog](https://github.com/ethereum/solidity-blog) in the ``Releases`` category and explain some of the new features or concepts. - - [ ] Create a post on [solidity-blog](https://github.com/ethereum/solidity-blog) in the ``Security Alerts`` category in case of important bug(s). + - [ ] Create a post on [solidity-website](https://github.com/ethereum/solidity-website/tree/main/src/posts) in the ``Releases`` category and explain some of the new features or concepts. + - [ ] Create a post on [solidity-website](https://github.com/ethereum/solidity-website/tree/main/src/posts) in the ``Security Alerts`` category in case of important bug(s). ### Changelog - [ ] Sort the changelog entries alphabetically and correct any errors you notice. Commit it. @@ -104,9 +104,9 @@ At least a day before the release: - [ ] Make sure the documentation for the new release has been published successfully. Go to the [documentation status page at ReadTheDocs](https://readthedocs.org/projects/solidity/) and verify that the new version is listed, works and is marked as default. - [ ] Remove "still in progress" warning from the [release notes](https://github.com/ethereum/solidity/releases). - - [ ] Merge the [blog posts](https://github.com/ethereum/solidity-blog/pulls) related to the release. + - [ ] Merge the [blog posts](https://github.com/ethereum/solidity-website/pulls) related to the release. - [ ] Create a commit to increase the version number on ``develop`` in ``CMakeLists.txt`` and add a new skeleton changelog entry. - - [ ] Update the release information section [in the source of soliditylang.org](https://github.com/ethereum/solidity-portal/blob/master/index.html). + - [ ] Update the release information section [in the source of soliditylang.org](https://github.com/ethereum/solidity-website/blob/main/src/pages/index.tsx). - [ ] Announce on [Twitter](https://twitter.com/solidity_lang), including links to the release and the blog post. - [ ] Announce on [Fosstodon](https://fosstodon.org/@solidity/), including links to the release and the blog post. - [ ] Share the announcement on Reddit in [``/r/ethdev``](https://reddit.com/r/ethdev/), cross-posted to [``/r/ethereum``](https://reddit.com/r/ethereum/). From 5b72c4f494a4330ae04fde7f9250084c9dfb1434 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Tue, 18 Jul 2023 22:15:14 +0200 Subject: [PATCH 003/150] Fix typos --- CMakeLists.txt | 2 +- ReleaseChecklist.md | 2 +- docs/060-breaking-changes.rst | 2 +- docs/using-the-compiler.rst | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 51f1511ce606..73e7930b7222 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13.0) -set(ETH_CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake" CACHE PATH "The the path to the cmake directory") +set(ETH_CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake" CACHE PATH "The path to the cmake directory") list(APPEND CMAKE_MODULE_PATH ${ETH_CMAKE_DIR}) # Set the build type, if none was specified. diff --git a/ReleaseChecklist.md b/ReleaseChecklist.md index 8892566820cd..994b9692fe7f 100644 --- a/ReleaseChecklist.md +++ b/ReleaseChecklist.md @@ -5,7 +5,7 @@ [solc-bin](https://github.com/ethereum/solc-bin), [homebrew-ethereum](https://github.com/ethereum/homebrew-ethereum), [solidity-blog](https://github.com/ethereum/solidity-blog) and [solidity-portal](https://github.com/ethereum/solidity-portal) repositories. - [ ] DockerHub account with push rights to the [``solc`` image](https://hub.docker.com/r/ethereum/solc). - - [ ] Lauchpad (Ubuntu One) account with a membership in the ["Ethereum" team](https://launchpad.net/~ethereum) and + - [ ] Launchpad (Ubuntu One) account with a membership in the ["Ethereum" team](https://launchpad.net/~ethereum) and a gnupg key for your email in the ``ethereum.org`` domain (has to be version 1, gpg2 won't work). - [ ] Ubuntu/Debian dependencies of the PPA scripts: ``devscripts``, ``debhelper``, ``dput``, ``git``, ``wget``, ``ca-certificates``. - [ ] [npm Registry](https://www.npmjs.com) account added as a collaborator for the [``solc`` package](https://www.npmjs.com/package/solc). diff --git a/docs/060-breaking-changes.rst b/docs/060-breaking-changes.rst index 25bc15b875c6..e7c93057f62a 100644 --- a/docs/060-breaking-changes.rst +++ b/docs/060-breaking-changes.rst @@ -112,7 +112,7 @@ New Error Reporter ~~~~~~~~~~~~~~~~~~ A new error reporter was introduced, which aims at producing more accessible error messages on the command-line. -It is enabled by default, but passing ``--old-reporter`` falls back to the the deprecated old error reporter. +It is enabled by default, but passing ``--old-reporter`` falls back to the deprecated old error reporter. Metadata Hash Options ~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/using-the-compiler.rst b/docs/using-the-compiler.rst index 3c0c1a70b609..1a7406f44960 100644 --- a/docs/using-the-compiler.rst +++ b/docs/using-the-compiler.rst @@ -359,7 +359,7 @@ Input Description // Addresses of the libraries. If not all libraries are given here, // it can result in unlinked objects whose output data is different. "libraries": { - // The top level key is the the name of the source file where the library is used. + // The top level key is the name of the source file where the library is used. // If remappings are used, this source file should match the global path // after remappings were applied. // If this key is an empty string, that refers to a global level. From 927eddee84a645807ff59f82567d5fd8e69a80ce Mon Sep 17 00:00:00 2001 From: r0qs Date: Fri, 21 Jul 2023 15:54:59 +0200 Subject: [PATCH 004/150] Add TMP and remove TODO and FIXME from pylint note tags list --- scripts/pylintrc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/pylintrc b/scripts/pylintrc index 735810ad5216..5ef5a6eff333 100644 --- a/scripts/pylintrc +++ b/scripts/pylintrc @@ -63,3 +63,7 @@ expected-line-ending-format=LF # Maximum number of characters on a single line. max-line-length=130 + +[MISCELLANEOUS] + +notes=XXX,TMP From ab4f5f298330da2c25e478d94be0f840df6e9ae1 Mon Sep 17 00:00:00 2001 From: r0qs Date: Fri, 13 Jan 2023 11:43:34 +0100 Subject: [PATCH 005/150] Initial prototype of prb-math external tests using foundry rewritten in python MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kamil Śliwak --- .circleci/config.yml | 6 +- scripts/externalTests/runners/base.py | 172 +++++++++++++++++++++++ scripts/externalTests/runners/foundry.py | 110 +++++++++++++++ scripts/externalTests/test_helpers.py | 151 ++++++++++++++++++++ test/externalTests/prb-math.py | 53 +++++++ test/external_tests.py | 2 +- 6 files changed, 491 insertions(+), 3 deletions(-) create mode 100644 scripts/externalTests/runners/base.py create mode 100644 scripts/externalTests/runners/foundry.py create mode 100644 scripts/externalTests/test_helpers.py create mode 100755 test/externalTests/prb-math.py diff --git a/.circleci/config.yml b/.circleci/config.yml index bb6e562f11fe..38e9ee47f260 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -691,7 +691,7 @@ defaults: name: t_native_test_ext_prb_math project: prb-math binary_type: native - image: cimg/node:18.16 + image: cimg/rust:1.70 - job_native_test_ext_elementfi: &job_native_test_ext_elementfi <<: *requires_b_ubu_static @@ -1724,11 +1724,13 @@ workflows: - t_native_test_ext_yield_liquidator - t_native_test_ext_perpetual_pools - t_native_test_ext_uniswap - - t_native_test_ext_prb_math - t_native_test_ext_elementfi - t_native_test_ext_brink # NOTE: We are disabling gp2 tests due to constant failures. #- t_native_test_ext_gp2 + # TODO: Dropping prb-math from the benchmarks since it is not implemented yet + # in the new Foundry external testing infrastructure. + # - t_native_test_ext_prb_math # NOTE: The external tests below were commented because they # depend on a specific version of hardhat which does not support shanghai EVM. #- t_native_test_ext_trident diff --git a/scripts/externalTests/runners/base.py b/scripts/externalTests/runners/base.py new file mode 100644 index 000000000000..a79ed53442e9 --- /dev/null +++ b/scripts/externalTests/runners/base.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python3 + +# ------------------------------------------------------------------------------ +# This file is part of solidity. +# +# solidity is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# solidity is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with solidity. If not, see +# +# (c) 2023 solidity contributors. +# ------------------------------------------------------------------------------ + +import os +import subprocess +from abc import ABCMeta +from abc import abstractmethod +from dataclasses import dataclass +from dataclasses import field +from pathlib import Path +from shutil import rmtree +from tempfile import mkdtemp +from textwrap import dedent +from typing import List +from typing import Set + +from test_helpers import download_project +from test_helpers import get_solc_short_version +from test_helpers import parse_command_line +from test_helpers import parse_custom_presets +from test_helpers import parse_solc_version +from test_helpers import replace_version_pragmas +from test_helpers import settings_from_preset +from test_helpers import SettingsPreset + +CURRENT_EVM_VERSION: str = "shanghai" + +@dataclass +class TestConfig: + name: str + repo_url: str + ref_type: str + ref: str + compile_only_presets: List[SettingsPreset] = field(default_factory=list) + settings_presets: List[SettingsPreset] = field(default_factory=lambda: list(SettingsPreset)) + evm_version: str = field(default=CURRENT_EVM_VERSION) + + def selected_presets(self) -> Set[SettingsPreset]: + return set(self.compile_only_presets + self.settings_presets) + + +class BaseRunner(metaclass=ABCMeta): + config: TestConfig + solc_binary_type: str + solc_binary_path: Path + presets: Set[SettingsPreset] + + def __init__(self, argv, config: TestConfig): + args = parse_command_line(f"{config.name} external tests", argv) + self.config = config + self.solc_binary_type = args.solc_binary_type + self.solc_binary_path = args.solc_binary_path + self.presets = parse_custom_presets(args.selected_presets) if args.selected_presets else config.selected_presets() + self.env = os.environ.copy() + self.tmp_dir = mkdtemp(prefix=f"ext-test-{config.name}-") + self.test_dir = Path(self.tmp_dir) / "ext" + + def setup_solc(self) -> str: + if self.solc_binary_type == "solcjs": + # TODO: add support to solc-js + raise NotImplementedError() + print("Setting up solc...") + solc_version_output = subprocess.check_output( + [self.solc_binary_path, "--version"], + shell=False, + encoding="utf-8" + ).split(":")[1] + return parse_solc_version(solc_version_output) + + @staticmethod + def enter_test_dir(fn): + """Run a function inside the test directory""" + + previous_dir = os.getcwd() + def f(self, *args, **kwargs): + try: + assert self.test_dir is not None + os.chdir(self.test_dir) + return fn(self, *args, **kwargs) + finally: + # Restore the previous directory after execute fn + os.chdir(previous_dir) + return f + + def setup_environment(self): + """Configure the project build environment""" + print("Configuring Runner building environment...") + replace_version_pragmas(self.test_dir) + + @enter_test_dir + def clean(self): + """Clean temporary directories""" + rmtree(self.tmp_dir) + + @enter_test_dir + @abstractmethod + def configure(self): + raise NotImplementedError() + + @enter_test_dir + @abstractmethod + def compile(self, preset: SettingsPreset): + raise NotImplementedError() + + @enter_test_dir + @abstractmethod + def run_test(self): + raise NotImplementedError() + +def run_test(runner: BaseRunner): + print(f"Testing {runner.config.name}...\n===========================") + print(f"Selected settings presets: {' '.join(p.value for p in runner.presets)}") + + # Configure solc compiler + solc_version = runner.setup_solc() + print(f"Using compiler version {solc_version}") + + # Download project + download_project(runner.test_dir, runner.config.repo_url, runner.config.ref_type, runner.config.ref) + + # Configure run environment + runner.setup_environment() + + # Configure TestRunner instance + print(dedent(f"""\ + Configuring runner's profiles with: + ------------------------------------- + Binary type: {runner.solc_binary_type} + Compiler path: {runner.solc_binary_path} + ------------------------------------- + """)) + runner.configure() + for preset in runner.presets: + print("Running compile function...") + settings = settings_from_preset(preset, runner.config.evm_version) + print(dedent(f"""\ + ------------------------------------- + Settings preset: {preset.value} + Settings: {settings} + EVM version: {runner.config.evm_version} + Compiler version: {get_solc_short_version(solc_version)} + Compiler version (full): {solc_version} + ------------------------------------- + """)) + runner.compile(preset) + # TODO: COMPILE_ONLY should be a command-line option + if os.environ.get("COMPILE_ONLY") == "1" or preset in runner.config.compile_only_presets: + print("Skipping test function...") + else: + print("Running test function...") + runner.run_test() + # TODO: store_benchmark_report + runner.clean() + print("Done.") diff --git a/scripts/externalTests/runners/foundry.py b/scripts/externalTests/runners/foundry.py new file mode 100644 index 000000000000..0b171250f77e --- /dev/null +++ b/scripts/externalTests/runners/foundry.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 + +# ------------------------------------------------------------------------------ +# This file is part of solidity. +# +# solidity is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# solidity is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with solidity. If not, see +# +# (c) 2023 solidity contributors. +# ------------------------------------------------------------------------------ + +import os +import re +import subprocess +from shutil import which +from textwrap import dedent +from typing import Optional + +from runners.base import BaseRunner +from test_helpers import SettingsPreset +from test_helpers import settings_from_preset + +def run_forge_command(command: str, env: Optional[dict] = None): + subprocess.run( + command.split(), + env=env if env is not None else os.environ.copy(), + check=True + ) + + +class FoundryRunner(BaseRunner): + """Configure and run Foundry-based projects""" + + FOUNDRY_CONFIG_FILE = "foundry.toml" + + def setup_environment(self): + super().setup_environment() + if which("forge") is None: + raise RuntimeError("Forge not found.") + + @staticmethod + def profile_name(preset: SettingsPreset): + """Returns foundry profile name""" + # Replace - or + by underscore to avoid invalid toml syntax + return re.sub(r"(\-|\+)+", "_", preset.value) + + @staticmethod + def profile_section(profile_fields: dict) -> str: + return dedent("""\ + [profile.{name}] + gas_reports = ["*"] + auto_detect_solc = false + solc = "{solc}" + evm_version = "{evm_version}" + optimizer = {optimizer} + via_ir = {via_ir} + + [profile.{name}.optimizer_details] + yul = {yul} + """).format(**profile_fields) + + @BaseRunner.enter_test_dir + def configure(self): + """Configure forge tests profiles""" + + profiles = [] + for preset in self.presets: + settings = settings_from_preset(preset, self.config.evm_version) + profiles.append(self.profile_section({ + "name": self.profile_name(preset), + "solc": self.solc_binary_path, + "evm_version": self.config.evm_version, + "optimizer": str(settings["optimizer"]["enabled"]).lower(), + "via_ir": str(settings["viaIR"]).lower(), + "yul": str(settings["optimizer"]["details"]["yul"]).lower(), + })) + + with open( + file=self.test_dir / self.FOUNDRY_CONFIG_FILE, + mode="a", + encoding="utf-8", + ) as f: + for profile in profiles: + f.write(profile) + + run_forge_command("forge install", self.env) + + @BaseRunner.enter_test_dir + def compile(self, preset: SettingsPreset): + """Compile project""" + + # Set the Foundry profile environment variable + self.env.update({"FOUNDRY_PROFILE": self.profile_name(preset)}) + run_forge_command("forge build", self.env) + + @BaseRunner.enter_test_dir + def run_test(self): + """Run project tests""" + + run_forge_command("forge test --gas-report", self.env) diff --git a/scripts/externalTests/test_helpers.py b/scripts/externalTests/test_helpers.py new file mode 100644 index 000000000000..9a573d50adf0 --- /dev/null +++ b/scripts/externalTests/test_helpers.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 + +# ------------------------------------------------------------------------------ +# This file is part of solidity. +# +# solidity is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# solidity is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with solidity. If not, see +# +# (c) 2023 solidity contributors. +# ------------------------------------------------------------------------------ + +import os +import re +import subprocess +import sys +from argparse import ArgumentParser +from enum import Enum +from pathlib import Path +from typing import List +from typing import Set + +# Our scripts/ is not a proper Python package so we need to modify PYTHONPATH to import from it +# pragma pylint: disable=import-error,wrong-import-position +PROJECT_ROOT = Path(__file__).parents[2] +sys.path.insert(0, f"{PROJECT_ROOT}/scripts/common") + +from git_helpers import git_commit_hash + +SOLC_FULL_VERSION_REGEX = re.compile(r"^[a-zA-Z: ]*(.*)$") +SOLC_SHORT_VERSION_REGEX = re.compile(r"^([0-9.]+).*\+|\-$") + + +class SettingsPreset(Enum): + LEGACY_NO_OPTIMIZE = 'legacy-no-optimize' + IR_NO_OPTIMIZE = 'ir-no-optimize' + LEGACY_OPTIMIZE_EVM_ONLY = 'legacy-optimize-evm-only' + IR_OPTIMIZE_EVM_ONLY = 'ir-optimize-evm-only' + LEGACY_OPTIMIZE_EVM_YUL = 'legacy-optimize-evm+yul' + IR_OPTIMIZE_EVM_YUL = 'ir-optimize-evm+yul' + + +def compiler_settings(evm_version: str, via_ir: bool = False, optimizer: bool = False, yul: bool = False) -> dict: + return { + "optimizer": {"enabled": optimizer, "details": {"yul": yul}}, + "evmVersion": evm_version, + "viaIR": via_ir, + } + + +def settings_from_preset(preset: SettingsPreset, evm_version: str) -> dict: + return { + SettingsPreset.LEGACY_NO_OPTIMIZE: compiler_settings(evm_version), + SettingsPreset.IR_NO_OPTIMIZE: compiler_settings(evm_version, via_ir=True), + SettingsPreset.LEGACY_OPTIMIZE_EVM_ONLY: compiler_settings(evm_version, optimizer=True), + SettingsPreset.IR_OPTIMIZE_EVM_ONLY: compiler_settings(evm_version, via_ir=True, optimizer=True), + SettingsPreset.LEGACY_OPTIMIZE_EVM_YUL: compiler_settings(evm_version, optimizer=True, yul=True), + SettingsPreset.IR_OPTIMIZE_EVM_YUL: compiler_settings(evm_version, via_ir=True, optimizer=True, yul=True), + }[preset] + + +def parse_custom_presets(presets: List[str]) -> Set[SettingsPreset]: + return {SettingsPreset(p) for p in presets} + +def parse_command_line(description: str, args: List[str]): + arg_parser = ArgumentParser(description) + arg_parser.add_argument( + "solc_binary_type", + metavar="solc-binary-type", + type=str, + default="native", + choices=["native", "solcjs"], + help="""Solidity compiler binary type""", + ) + arg_parser.add_argument( + "solc_binary_path", + metavar="solc-binary-path", + type=Path, + help="""Path to solc binary""", + ) + arg_parser.add_argument( + "selected_presets", + metavar="selected-presets", + help="""List of compiler settings presets""", + nargs='*', + ) + return arg_parser.parse_args(args) + + +def download_project(test_dir: Path, repo_url: str, ref_type: str = "branch", ref: str = "master"): + assert ref_type in ("commit", "branch", "tag") + + print(f"Cloning {ref_type} {ref} of {repo_url}...") + if ref_type == "commit": + os.mkdir(test_dir) + os.chdir(test_dir) + subprocess.run(["git", "init"], check=True) + subprocess.run(["git", "remote", "add", "origin", repo_url], check=True) + subprocess.run(["git", "fetch", "--depth", "1", "origin", ref], check=True) + subprocess.run(["git", "reset", "--hard", "FETCH_HEAD"], check=True) + else: + os.chdir(test_dir.parent) + subprocess.run(["git", "clone", "--no-progress", "--depth", "1", repo_url, "-b", ref, test_dir.resolve()], check=True) + if not test_dir.exists(): + raise RuntimeError("Failed to clone the project.") + os.chdir(test_dir) + + if (test_dir / ".gitmodules").exists(): + subprocess.run(["git", "submodule", "update", "--init"], check=True) + + print(f"Current commit hash: {git_commit_hash()}") + + +def parse_solc_version(solc_version_string: str) -> str: + solc_version_match = re.search(SOLC_FULL_VERSION_REGEX, solc_version_string) + if solc_version_match is None: + raise RuntimeError(f"Solc version could not be found in: {solc_version_string}.") + return solc_version_match.group(1) + + +def get_solc_short_version(solc_full_version: str) -> str: + solc_short_version_match = re.search(SOLC_SHORT_VERSION_REGEX, solc_full_version) + if solc_short_version_match is None: + raise RuntimeError(f"Error extracting short version string from: {solc_full_version}.") + return solc_short_version_match.group(1) + + +def store_benchmark_report(self): + raise NotImplementedError() + + +def replace_version_pragmas(test_dir: Path): + """ + Replace fixed-version pragmas (part of Consensys best practice). + Include all directories to also cover node dependencies. + """ + print("Replacing fixed-version pragmas...") + for source in test_dir.glob("**/*.sol"): + content = source.read_text(encoding="utf-8") + content = re.sub(r"pragma solidity [^;]+;", r"pragma solidity >=0.0;", content) + with open(source, "w", encoding="utf-8") as f: + f.write(content) diff --git a/test/externalTests/prb-math.py b/test/externalTests/prb-math.py new file mode 100755 index 000000000000..0a4ce8ff9565 --- /dev/null +++ b/test/externalTests/prb-math.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 + +# ------------------------------------------------------------------------------ +# This file is part of solidity. +# +# solidity is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# solidity is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with solidity. If not, see +# +# (c) 2023 solidity contributors. +# ------------------------------------------------------------------------------ + +import sys +from pathlib import Path + +# Our scripts/ is not a proper Python package so we need to modify PYTHONPATH to import from it +# pragma pylint: disable=import-error,wrong-import-position +PROJECT_ROOT = Path(__file__).parents[2] +sys.path.insert(0, f"{PROJECT_ROOT}/scripts/externalTests") + +from runners.base import run_test +from runners.base import TestConfig +from runners.foundry import FoundryRunner +from test_helpers import SettingsPreset + +test_config = TestConfig( + name="PRBMath", + repo_url="https://github.com/PaulRBerg/prb-math.git", + ref_type="branch", + ref="main", + compile_only_presets=[ + # pylint: disable=line-too-long + # SettingsPreset.IR_NO_OPTIMIZE, # Error: Yul exception:Variable expr_15699_address is 2 slot(s) too deep inside the stack. Stack too deep. + # SettingsPreset.IR_OPTIMIZE_EVM_ONLY, # Error: Yul exception:Variable expr_15699_address is 2 slot(s) too deep inside the stack. Stack too deep. + ], + settings_presets=[ + SettingsPreset.LEGACY_NO_OPTIMIZE, + SettingsPreset.LEGACY_OPTIMIZE_EVM_ONLY, + SettingsPreset.LEGACY_OPTIMIZE_EVM_YUL, + SettingsPreset.IR_OPTIMIZE_EVM_YUL, + ], +) + +sys.exit(run_test(FoundryRunner(argv=sys.argv[1:], config=test_config))) diff --git a/test/external_tests.py b/test/external_tests.py index 59b22af7e584..a7b8e87e8324 100755 --- a/test/external_tests.py +++ b/test/external_tests.py @@ -36,7 +36,7 @@ def detect_external_tests() -> dict: return { file_path.stem: file_path for file_path in Path(EXTERNAL_TESTS_DIR).iterdir() - if file_path.is_file() and file_path.suffix == ".sh" + if file_path.is_file() and file_path.suffix in (".sh", ".py") } From dcbd6457984844af420b3ee2abe461fb0859dcf3 Mon Sep 17 00:00:00 2001 From: r0qs Date: Wed, 19 Apr 2023 17:16:21 +0200 Subject: [PATCH 006/150] Delete old prb-math.sh script --- test/externalTests/prb-math.sh | 116 --------------------------------- 1 file changed, 116 deletions(-) delete mode 100755 test/externalTests/prb-math.sh diff --git a/test/externalTests/prb-math.sh b/test/externalTests/prb-math.sh deleted file mode 100755 index fcf1aa208ee9..000000000000 --- a/test/externalTests/prb-math.sh +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env bash - -# ------------------------------------------------------------------------------ -# This file is part of solidity. -# -# solidity is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# solidity is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with solidity. If not, see -# -# (c) 2022 solidity contributors. -#------------------------------------------------------------------------------ - -set -e - -source scripts/common.sh -source scripts/externalTests/common.sh - -REPO_ROOT=$(realpath "$(dirname "$0")/../..") - -verify_input "$@" -BINARY_TYPE="$1" -BINARY_PATH="$(realpath "$2")" -SELECTED_PRESETS="$3" - -function compile_fn { yarn compile; } -# NOTE: `yarn test` runs `mocha` which seems to disable the gas reporter. -function test_fn { npx --no hardhat --no-compile test; } - -function prb_math_test -{ - local repo="https://github.com/paulrberg/prb-math" - local ref_type=branch - # We currently pin the prb-math version to the latest version that support hardhat - # Please see here for details: https://github.com/ethereum/solidity/issues/13767 - local ref=v2.5.0 - local config_file="hardhat.config.ts" - local config_var="config" - - local compile_only_presets=( - ir-no-optimize # Tests fail with "Error: Transaction reverted: trying to deploy a contract whose code is too large" - ) - local settings_presets=( - "${compile_only_presets[@]}" - ir-optimize-evm-only - ir-optimize-evm+yul - legacy-optimize-evm-only - legacy-optimize-evm+yul - legacy-no-optimize - ) - - [[ $SELECTED_PRESETS != "" ]] || SELECTED_PRESETS=$(circleci_select_steps_multiarg "${settings_presets[@]}") - print_presets_or_exit "$SELECTED_PRESETS" - - setup_solc "$DIR" "$BINARY_TYPE" "$BINARY_PATH" - download_project "$repo" "$ref_type" "$ref" "$DIR" - - cp .env.example .env - - # The project has yarn 3.1.0 binary stored in the repo and yarnrc forces the yarn 1.x binary - # installed system-wide to use it. Unfortunately Yarn 3 fails in weird ways when we remove - # yarn.lock. Remove the config to restore Yarn 1.x. - rm .yarnrc.yml - - # Disable tests that won't pass on the ir presets due to Hardhat heuristics. Note that this also disables - # them for other presets but that's fine - we want same code run for benchmarks to be comparable. - # TODO: Remove this when Hardhat adjusts heuristics for IR (https://github.com/nomiclabs/hardhat/issues/3365). - pushd test/contracts/prbMathUd60x18/pure/ - sed -i 's|context(\("when the sum overflows"\)|context.skip(\1|g' add.test.ts - sed -i 's|context(\("when the sum does not overflow"\)|context.skip(\1|g' add.test.ts - sed -i 's|context(\("when both operands are zero"\)|context.skip(\1|g' avg.test.ts - sed -i 's|context(\("when one operand is zero and the other is not zero"\)|context.skip(\1|g' avg.test.ts - sed -i 's|context(\("when the denominator is zero"\)|context.skip(\1|g' div.test.ts - sed -i 's|context(\("when x is zero"\)|context.skip(\1|g' inv.test.ts - popd - pushd test/contracts/prbMathSd59x18/pure/ - sed -i 's|context(\("when the sum overflows"\)|context.skip(\1|g' add.test.ts - sed -i 's|context(\("when the sum underflows"\)|context.skip(\1|g' add.test.ts - sed -i 's|context(\("when the denominator is zero"\)|context.skip(\1|g' div.test.ts - sed -i 's|context(\("when x is zero"\)|context.skip(\1|g' inv.test.ts - sed -i 's|context(\("when the difference underflows"\)|context.skip(\1|g' sub.test.ts - sed -i 's|context(\("when the difference overflows"\)|context.skip(\1|g' sub.test.ts - popd - - neutralize_package_lock - neutralize_package_json_hooks - force_hardhat_compiler_binary "$config_file" "$BINARY_TYPE" "$BINARY_PATH" - force_hardhat_compiler_settings "$config_file" "$(first_word "$SELECTED_PRESETS")" "$config_var" - yarn install --no-lock-file - yarn add hardhat-gas-reporter - - # Workaround for error caused by the last release of hardhat-waffle@2.0.6 that bumps ethereum-waffle - # to version 4.0.10 and breaks prb-math build with the following error: - # - # Cannot find module 'ethereum-waffle/dist/cjs/src/deployContract' - # - # See: https://github.com/NomicFoundation/hardhat-waffle/commit/83ee9cb36ee59d0bedacbbd00043f030af104ad0 - yarn add '@nomiclabs/hardhat-waffle@2.0.5' - - replace_version_pragmas - - for preset in $SELECTED_PRESETS; do - hardhat_run_test "$config_file" "$preset" "${compile_only_presets[*]}" compile_fn test_fn "$config_var" - store_benchmark_report hardhat prb-math "$repo" "$preset" - done -} - -external_test PRBMath prb_math_test From 964bdc711ccd81253251ebc0af4fb1919de5681e Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Thu, 20 Jul 2023 13:28:03 +0200 Subject: [PATCH 007/150] Fix ICE when emitting event from another contract --- Changelog.md | 1 + libsolidity/interface/Natspec.cpp | 17 -- .../event_emitted_from_foreign_contract.sol | 112 +++++++ .../event_emitted_from_foreign_contract.json | 289 ++++++++++++++++++ .../event_emitted_from_foreign_contract.sol | 10 + ...itted_from_foreign_contract_parseOnly.json | 194 ++++++++++++ test/libsolidity/SolidityNatspecJSON.cpp | 173 +++++++++++ .../event_emit_from_a_foreign_contract.sol | 13 + ...emit_from_a_foreign_contract_same_name.sol | 17 ++ ...event_emit_interface_event_via_library.sol | 19 ++ .../events/event_emit_via_interface.sol | 13 + 11 files changed, 841 insertions(+), 17 deletions(-) create mode 100644 test/libsolidity/ABIJson/event_emitted_from_foreign_contract.sol create mode 100644 test/libsolidity/ASTJSON/event_emitted_from_foreign_contract.json create mode 100644 test/libsolidity/ASTJSON/event_emitted_from_foreign_contract.sol create mode 100644 test/libsolidity/ASTJSON/event_emitted_from_foreign_contract_parseOnly.json create mode 100644 test/libsolidity/semanticTests/events/event_emit_from_a_foreign_contract.sol create mode 100644 test/libsolidity/semanticTests/events/event_emit_from_a_foreign_contract_same_name.sol create mode 100644 test/libsolidity/semanticTests/events/event_emit_interface_event_via_library.sol create mode 100644 test/libsolidity/semanticTests/events/event_emit_via_interface.sol diff --git a/Changelog.md b/Changelog.md index 4205e7416b4c..38a8aae41218 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,6 +7,7 @@ Compiler Features: Bugfixes: + * NatSpec: Fix internal error when requesting userdoc or devdoc for a contract that emits an event defined in a foreign contract or interface. ### 0.8.21 (2023-07-19) diff --git a/libsolidity/interface/Natspec.cpp b/libsolidity/interface/Natspec.cpp index b192dfda1be4..5733d3063c89 100644 --- a/libsolidity/interface/Natspec.cpp +++ b/libsolidity/interface/Natspec.cpp @@ -80,14 +80,6 @@ Json::Value Natspec::userDocumentation(ContractDefinition const& _contractDef) for (auto const& event: uniqueInterfaceEvents(_contractDef)) { - ContractDefinition const* eventOrigin = event->annotation().contract; - solAssert(eventOrigin); - solAssert( - *eventOrigin == _contractDef || - (!eventOrigin->isLibrary() && _contractDef.derivesFrom(*eventOrigin)) || - (eventOrigin->isLibrary() && !_contractDef.derivesFrom(*eventOrigin)) - ); - string value = extractDoc(event->annotation().docTags, "notice"); if (!value.empty()) doc["events"][event->functionType(true)->externalSignature()]["notice"] = value; @@ -178,16 +170,7 @@ Json::Value Natspec::devDocumentation(ContractDefinition const& _contractDef) for (auto const& event: uniqueInterfaceEvents(_contractDef)) if (auto devDoc = devDocumentation(event->annotation().docTags); !devDoc.empty()) - { - ContractDefinition const* eventOrigin = event->annotation().contract; - solAssert(eventOrigin); - solAssert( - *eventOrigin == _contractDef || - (!eventOrigin->isLibrary() && _contractDef.derivesFrom(*eventOrigin)) || - (eventOrigin->isLibrary() && !_contractDef.derivesFrom(*eventOrigin)) - ); doc["events"][event->functionType(true)->externalSignature()] = devDoc; - } for (auto const& error: _contractDef.interfaceErrors()) if (auto devDoc = devDocumentation(error->annotation().docTags); !devDoc.empty()) doc["errors"][error->functionType(true)->externalSignature()].append(devDoc); diff --git a/test/libsolidity/ABIJson/event_emitted_from_foreign_contract.sol b/test/libsolidity/ABIJson/event_emitted_from_foreign_contract.sol new file mode 100644 index 000000000000..30c115669752 --- /dev/null +++ b/test/libsolidity/ABIJson/event_emitted_from_foreign_contract.sol @@ -0,0 +1,112 @@ +interface I { + event Event(uint256 value); +} +contract C { + event Event(address indexed sender); +} +contract D { + event Event(address indexed sender); + function test(address sender) public { + emit I.Event(1); + emit C.Event(msg.sender); + emit Event(msg.sender); + } +} +// ---- +// :C +// [ +// { +// "anonymous": false, +// "inputs": +// [ +// { +// "indexed": true, +// "internalType": "address", +// "name": "sender", +// "type": "address" +// } +// ], +// "name": "Event", +// "type": "event" +// } +// ] +// +// +// :D +// [ +// { +// "anonymous": false, +// "inputs": +// [ +// { +// "indexed": false, +// "internalType": "uint256", +// "name": "value", +// "type": "uint256" +// } +// ], +// "name": "Event", +// "type": "event" +// }, +// { +// "anonymous": false, +// "inputs": +// [ +// { +// "indexed": true, +// "internalType": "address", +// "name": "sender", +// "type": "address" +// } +// ], +// "name": "Event", +// "type": "event" +// }, +// { +// "anonymous": false, +// "inputs": +// [ +// { +// "indexed": true, +// "internalType": "address", +// "name": "sender", +// "type": "address" +// } +// ], +// "name": "Event", +// "type": "event" +// }, +// { +// "inputs": +// [ +// { +// "internalType": "address", +// "name": "sender", +// "type": "address" +// } +// ], +// "name": "test", +// "outputs": [], +// "stateMutability": "nonpayable", +// "type": "function" +// } +// ] +// +// +// :I +// [ +// { +// "anonymous": false, +// "inputs": +// [ +// { +// "indexed": false, +// "internalType": "uint256", +// "name": "value", +// "type": "uint256" +// } +// ], +// "name": "Event", +// "type": "event" +// } +// ] diff --git a/test/libsolidity/ASTJSON/event_emitted_from_foreign_contract.json b/test/libsolidity/ASTJSON/event_emitted_from_foreign_contract.json new file mode 100644 index 000000000000..2d70e2f9feb8 --- /dev/null +++ b/test/libsolidity/ASTJSON/event_emitted_from_foreign_contract.json @@ -0,0 +1,289 @@ +{ + "absolutePath": "a", + "exportedSymbols": + { + "C": + [ + 5 + ], + "D": + [ + 19 + ] + }, + "id": 20, + "nodeType": "SourceUnit", + "nodes": + [ + { + "abstract": false, + "baseContracts": [], + "canonicalName": "C", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 5, + "linearizedBaseContracts": + [ + 5 + ], + "name": "C", + "nameLocation": "9:1:1", + "nodeType": "ContractDefinition", + "nodes": + [ + { + "anonymous": false, + "eventSelector": "bd1155618a34fd53d1a2de9f705f42f3582842cba0b985b25c59888d86e0c929", + "id": 4, + "name": "E", + "nameLocation": "23:1:1", + "nodeType": "EventDefinition", + "parameters": + { + "id": 3, + "nodeType": "ParameterList", + "parameters": + [ + { + "constant": false, + "id": 2, + "indexed": true, + "mutability": "mutable", + "name": "sender", + "nameLocation": "41:6:1", + "nodeType": "VariableDeclaration", + "scope": 4, + "src": "25:22:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": + { + "id": 1, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "25:7:1", + "stateMutability": "nonpayable", + "typeDescriptions": + { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "24:24:1" + }, + "src": "17:32:1" + } + ], + "scope": 20, + "src": "0:51:1", + "usedErrors": [], + "usedEvents": + [ + 4 + ] + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "D", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 19, + "linearizedBaseContracts": + [ + 19 + ], + "name": "D", + "nameLocation": "61:1:1", + "nodeType": "ContractDefinition", + "nodes": + [ + { + "body": + { + "id": 17, + "nodeType": "Block", + "src": "106:37:1", + "statements": + [ + { + "eventCall": + { + "arguments": + [ + { + "expression": + { + "id": 13, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "125:3:1", + "typeDescriptions": + { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 14, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "129:6:1", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "125:10:1", + "typeDescriptions": + { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": + { + "argumentTypes": + [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": + { + "id": 10, + "name": "C", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "121:1:1", + "typeDescriptions": + { + "typeIdentifier": "t_type$_t_contract$_C_$5_$", + "typeString": "type(contract C)" + } + }, + "id": 12, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "123:1:1", + "memberName": "E", + "nodeType": "MemberAccess", + "referencedDeclaration": 4, + "src": "121:3:1", + "typeDescriptions": + { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 15, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "121:15:1", + "tryCall": false, + "typeDescriptions": + { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16, + "nodeType": "EmitStatement", + "src": "116:20:1" + } + ] + }, + "functionSelector": "bb29998e", + "id": 18, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "test", + "nameLocation": "78:4:1", + "nodeType": "FunctionDefinition", + "parameters": + { + "id": 8, + "nodeType": "ParameterList", + "parameters": + [ + { + "constant": false, + "id": 7, + "mutability": "mutable", + "name": "sender", + "nameLocation": "91:6:1", + "nodeType": "VariableDeclaration", + "scope": 18, + "src": "83:14:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": + { + "id": 6, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "83:7:1", + "stateMutability": "nonpayable", + "typeDescriptions": + { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "82:16:1" + }, + "returnParameters": + { + "id": 9, + "nodeType": "ParameterList", + "parameters": [], + "src": "106:0:1" + }, + "scope": 19, + "src": "69:74:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 20, + "src": "52:93:1", + "usedErrors": [], + "usedEvents": + [ + 4 + ] + } + ], + "src": "0:146:1" +} diff --git a/test/libsolidity/ASTJSON/event_emitted_from_foreign_contract.sol b/test/libsolidity/ASTJSON/event_emitted_from_foreign_contract.sol new file mode 100644 index 000000000000..6cad968f6bed --- /dev/null +++ b/test/libsolidity/ASTJSON/event_emitted_from_foreign_contract.sol @@ -0,0 +1,10 @@ +contract C { + event E(address indexed sender); +} +contract D { + function test(address sender) public { + emit C.E(msg.sender); + } +} + +// ---- diff --git a/test/libsolidity/ASTJSON/event_emitted_from_foreign_contract_parseOnly.json b/test/libsolidity/ASTJSON/event_emitted_from_foreign_contract_parseOnly.json new file mode 100644 index 000000000000..b6c0ca5e0315 --- /dev/null +++ b/test/libsolidity/ASTJSON/event_emitted_from_foreign_contract_parseOnly.json @@ -0,0 +1,194 @@ +{ + "absolutePath": "a", + "id": 20, + "nodeType": "SourceUnit", + "nodes": + [ + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "id": 5, + "name": "C", + "nameLocation": "9:1:1", + "nodeType": "ContractDefinition", + "nodes": + [ + { + "anonymous": false, + "id": 4, + "name": "E", + "nameLocation": "23:1:1", + "nodeType": "EventDefinition", + "parameters": + { + "id": 3, + "nodeType": "ParameterList", + "parameters": + [ + { + "constant": false, + "id": 2, + "indexed": true, + "mutability": "mutable", + "name": "sender", + "nameLocation": "41:6:1", + "nodeType": "VariableDeclaration", + "src": "25:22:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": {}, + "typeName": + { + "id": 1, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "25:7:1", + "stateMutability": "nonpayable", + "typeDescriptions": {} + }, + "visibility": "internal" + } + ], + "src": "24:24:1" + }, + "src": "17:32:1" + } + ], + "src": "0:51:1", + "usedErrors": [], + "usedEvents": [] + }, + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "id": 19, + "name": "D", + "nameLocation": "61:1:1", + "nodeType": "ContractDefinition", + "nodes": + [ + { + "body": + { + "id": 17, + "nodeType": "Block", + "src": "106:37:1", + "statements": + [ + { + "eventCall": + { + "arguments": + [ + { + "expression": + { + "id": 13, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "src": "125:3:1", + "typeDescriptions": {} + }, + "id": 14, + "memberLocation": "129:6:1", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "125:10:1", + "typeDescriptions": {} + } + ], + "expression": + { + "expression": + { + "id": 10, + "name": "C", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "src": "121:1:1", + "typeDescriptions": {} + }, + "id": 12, + "memberLocation": "123:1:1", + "memberName": "E", + "nodeType": "MemberAccess", + "src": "121:3:1", + "typeDescriptions": {} + }, + "id": 15, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "121:15:1", + "tryCall": false, + "typeDescriptions": {} + }, + "id": 16, + "nodeType": "EmitStatement", + "src": "116:20:1" + } + ] + }, + "id": 18, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "test", + "nameLocation": "78:4:1", + "nodeType": "FunctionDefinition", + "parameters": + { + "id": 8, + "nodeType": "ParameterList", + "parameters": + [ + { + "constant": false, + "id": 7, + "mutability": "mutable", + "name": "sender", + "nameLocation": "91:6:1", + "nodeType": "VariableDeclaration", + "src": "83:14:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": {}, + "typeName": + { + "id": 6, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "83:7:1", + "stateMutability": "nonpayable", + "typeDescriptions": {} + }, + "visibility": "internal" + } + ], + "src": "82:16:1" + }, + "returnParameters": + { + "id": 9, + "nodeType": "ParameterList", + "parameters": [], + "src": "106:0:1" + }, + "src": "69:74:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "src": "52:93:1", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "0:146:1" +} diff --git a/test/libsolidity/SolidityNatspecJSON.cpp b/test/libsolidity/SolidityNatspecJSON.cpp index a54460eb624b..9ecd35aeff87 100644 --- a/test/libsolidity/SolidityNatspecJSON.cpp +++ b/test/libsolidity/SolidityNatspecJSON.cpp @@ -485,6 +485,179 @@ BOOST_AUTO_TEST_CASE(event) checkNatspec(sourceCode, "ERC20", userDoc, true); } +BOOST_AUTO_TEST_CASE(emit_event_from_foreign_contract) +{ + char const* sourceCode = R"( + contract X { + /// @notice Userdoc for event E. + /// @dev Devdoc for event E. + event E(); + } + + contract C { + function g() public { + emit X.E(); + } + } + )"; + + char const* devDoc = R"ABCDEF( + { + "events": + { + "E()": + { + "details": "Devdoc for event E." + } + }, + "kind": "dev", + "methods": {}, + "version": 1 + } + )ABCDEF"; + checkNatspec(sourceCode, "C", devDoc, false); + + char const* userDoc = R"ABCDEF( + { + "events": + { + "E()": + { + "notice": "Userdoc for event E." + } + }, + "kind": "user", + "methods": {}, + "version": 1 + } + )ABCDEF"; + checkNatspec(sourceCode, "C", userDoc, true); +} + +BOOST_AUTO_TEST_CASE(emit_event_from_foreign_contract_with_same_signature) +{ + char const* sourceCode = R"( + contract C { + /// @notice C.E event + /// @dev C.E event + event E(uint256 value); + } + + contract D { + /// @notice D.E event + /// @dev D.E event + event E(uint256 value); + + function test() public { + emit C.E(1); + emit E(2); + } + } + )"; + + char const* devDocC = R"ABCDEF( + { + "events": + { + "E(uint256)": + { + "details": "C.E event" + } + }, + "kind": "dev", + "methods": {}, + "version": 1 + } + )ABCDEF"; + checkNatspec(sourceCode, "C", devDocC, false); + + char const* devDocD = R"ABCDEF( + { + "events": + { + "E(uint256)": + { + "details": "D.E event" + } + }, + "kind": "dev", + "methods": {}, + "version": 1 + } + )ABCDEF"; + checkNatspec(sourceCode, "D", devDocD, false); + + char const* userDocC = R"ABCDEF( + { + "events": + { + "E(uint256)": + { + "notice": "C.E event" + } + }, + "kind": "user", + "methods": {}, + "version": 1 + } + )ABCDEF"; + checkNatspec(sourceCode, "C", userDocC, true); + + char const* userDocD = R"ABCDEF( + { + "events": + { + "E(uint256)": + { + "notice": "D.E event" + } + }, + "kind": "user", + "methods": {}, + "version": 1 + } + )ABCDEF"; + checkNatspec(sourceCode, "D", userDocD, true); +} + +// Tests that emitting an event from contract C in contract D does not inherit natspec from C.E +BOOST_AUTO_TEST_CASE(emit_event_from_foreign_contract_no_inheritance) +{ + char const* sourceCode = R"( + contract C { + /// @notice C.E event + /// @dev C.E event + event E(); + } + + contract D { + event E(); + + function test() public { + emit C.E(); + } + } + )"; + + char const* devDoc = R"ABCDEF( + { + "kind": "dev", + "methods": {}, + "version": 1 + } + )ABCDEF"; + checkNatspec(sourceCode, "D", devDoc, false); + + char const* userDoc = R"ABCDEF( + { + "kind": "user", + "methods": {}, + "version": 1 + } + )ABCDEF"; + checkNatspec(sourceCode, "D", userDoc, true); +} + BOOST_AUTO_TEST_CASE(emit_same_signature_event_library_contract) { char const* sourceCode = R"( diff --git a/test/libsolidity/semanticTests/events/event_emit_from_a_foreign_contract.sol b/test/libsolidity/semanticTests/events/event_emit_from_a_foreign_contract.sol new file mode 100644 index 000000000000..fcd7b6f4c5d9 --- /dev/null +++ b/test/libsolidity/semanticTests/events/event_emit_from_a_foreign_contract.sol @@ -0,0 +1,13 @@ +contract C { + event E(); +} + +contract D { + function test() public { + emit C.E(); + } +} + +// ---- +// test() -> +// ~ emit E() diff --git a/test/libsolidity/semanticTests/events/event_emit_from_a_foreign_contract_same_name.sol b/test/libsolidity/semanticTests/events/event_emit_from_a_foreign_contract_same_name.sol new file mode 100644 index 000000000000..05c03c20fe40 --- /dev/null +++ b/test/libsolidity/semanticTests/events/event_emit_from_a_foreign_contract_same_name.sol @@ -0,0 +1,17 @@ +contract C { + event E(uint256 value); +} + +contract D { + event E(uint256 value); + + function test() public { + emit C.E(1); + emit E(2); + } +} + +// ---- +// test() -> +// ~ emit E(uint256): 0x01 +// ~ emit E(uint256): 0x02 diff --git a/test/libsolidity/semanticTests/events/event_emit_interface_event_via_library.sol b/test/libsolidity/semanticTests/events/event_emit_interface_event_via_library.sol new file mode 100644 index 000000000000..9e24287ab781 --- /dev/null +++ b/test/libsolidity/semanticTests/events/event_emit_interface_event_via_library.sol @@ -0,0 +1,19 @@ +interface I { + event E(); +} + +library L { + function f() internal { + emit I.E(); + } +} + +contract C { + function g() public { + L.f(); + } +} + +// ---- +// g() -> +// ~ emit E() diff --git a/test/libsolidity/semanticTests/events/event_emit_via_interface.sol b/test/libsolidity/semanticTests/events/event_emit_via_interface.sol new file mode 100644 index 000000000000..7268e9ac503b --- /dev/null +++ b/test/libsolidity/semanticTests/events/event_emit_via_interface.sol @@ -0,0 +1,13 @@ +interface I { + event Event(address indexed _from, uint256 _value); +} + +contract C { + function emitEvent(uint256 _value) public { + emit I.Event(msg.sender, _value); + } +} + +// ---- +// emitEvent(uint256): 100 -> +// ~ emit Event(address,uint256): #0x1212121212121212121212121212120000000012, 0x64 From b4407d90a58bb6d1e3666ec3bd8d57537dbe9c46 Mon Sep 17 00:00:00 2001 From: shalaamum <120459177+shalaamum@users.noreply.github.com> Date: Sat, 10 Jun 2023 17:10:39 +0200 Subject: [PATCH 008/150] Small documentation fixes --- docs/path-resolution.rst | 2 +- docs/types/reference-types.rst | 2 +- docs/using-the-compiler.rst | 2 +- docs/yul.rst | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/path-resolution.rst b/docs/path-resolution.rst index 00831e609aa6..1c5a39516fe4 100644 --- a/docs/path-resolution.rst +++ b/docs/path-resolution.rst @@ -515,7 +515,7 @@ you can use the following in your source file: The compiler will look for the file in the VFS under ``dapp-bin/library/math.sol``. If the file is not available there, the source unit name will be passed to the Host Filesystem -Loader, which will then look in ``/project/dapp-bin/library/iterable_mapping.sol``. +Loader, which will then look in ``/project/dapp-bin/library/math.sol``. .. warning:: diff --git a/docs/types/reference-types.rst b/docs/types/reference-types.rst index a136497e63aa..d2e9300e64a4 100644 --- a/docs/types/reference-types.rst +++ b/docs/types/reference-types.rst @@ -372,7 +372,7 @@ Array Members .. note:: In EVM versions before Byzantium, it was not possible to access - dynamic arrays return from function calls. If you call functions + dynamic arrays returned from function calls. If you call functions that return dynamic arrays, make sure to use an EVM that is set to Byzantium mode. diff --git a/docs/using-the-compiler.rst b/docs/using-the-compiler.rst index 1a7406f44960..4df00d975a41 100644 --- a/docs/using-the-compiler.rst +++ b/docs/using-the-compiler.rst @@ -408,7 +408,7 @@ Input Description // evm.methodIdentifiers - The list of function hashes // evm.gasEstimates - Function gas estimates // - // Note that using a using `evm`, `evm.bytecode`, etc. will select every + // Note that using `evm`, `evm.bytecode`, etc. will select every // target part of that output. Additionally, `*` can be used as a wildcard to request everything. // "outputSelection": { diff --git a/docs/yul.rst b/docs/yul.rst index 436d0b146240..cf47c1e877fc 100644 --- a/docs/yul.rst +++ b/docs/yul.rst @@ -741,7 +741,7 @@ EVM Dialect ----------- The default dialect of Yul currently is the EVM dialect for the currently selected version of the EVM. -with a version of the EVM. The only type available in this dialect +The only type available in this dialect is ``u256``, the 256-bit native type of the Ethereum Virtual Machine. Since it is the default type of this dialect, it can be omitted. From 4fa48a6eb1a1c33f60fc92e5895486dbdea294be Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 24 Jul 2023 07:48:18 -0700 Subject: [PATCH 009/150] patch other-version menu overflow [Fixes #14429] (#14431) --- docs/_static/css/custom.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index ed21675dd24d..7519db8e1cc5 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -16,6 +16,7 @@ --navHeight: 4.5rem; --sideWidth: 300px; + --currentVersionHeight: 45px; text-rendering: geometricPrecision; -webkit-font-smoothing: antialiased; @@ -658,6 +659,8 @@ ul.search .context { .rst-other-versions { background: var(--white) !important; color: var(--color-a) !important; + max-height: calc(100vh - var(--navHeight) - var(--currentVersionHeight)); + overflow-y: scroll; } .rst-other-versions a { From 83fe3d4011e3d14385f83aef0c32a0d894273501 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 24 Jul 2023 07:48:39 -0700 Subject: [PATCH 010/150] update GH edit path to `develop` branch (#14437) --- docs/_static/js/initialize.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/_static/js/initialize.js b/docs/_static/js/initialize.js index c875b37df864..04afa10e450e 100644 --- a/docs/_static/js/initialize.js +++ b/docs/_static/js/initialize.js @@ -143,6 +143,19 @@ const updateActiveNavLink = () => { document.addEventListener("locationchange", updateActiveNavLink); +function updateGitHubEditPath() { + // Replaces the version number in the GitHub edit path with "develop" + const gitHubEditAnchor = document.querySelector(".wy-breadcrumbs-aside > a"); + const url = new URL(gitHubEditAnchor.href); + const split = url.pathname.split("/"); + const versionIndex = split.indexOf("blob") + 1; + split[versionIndex] = "develop"; + url.pathname = split.join("/"); + gitHubEditAnchor.setAttribute("href", url.toString()); + gitHubEditAnchor.setAttribute("target", "_blank"); + gitHubEditAnchor.setAttribute("rel", "noopener noreferrer"); +} + function initialize() { // Preload fonts const fonts = [ @@ -214,6 +227,9 @@ function initialize() { // Update active nav link updateActiveNavLink(); + + // Update GitHub edit path to direct to `develop` branch + updateGitHubEditPath(); } document.addEventListener("DOMContentLoaded", initialize); From 2e3879840893d927926482ab3826220b7e617552 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Mon, 24 Jul 2023 17:01:12 +0200 Subject: [PATCH 011/150] SMTChecker: Keep counterexamples on test expectation update --- test/libsolidity/SMTCheckerTest.cpp | 8 ++++++++ test/libsolidity/SMTCheckerTest.h | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/test/libsolidity/SMTCheckerTest.cpp b/test/libsolidity/SMTCheckerTest.cpp index 288527e04899..dddee7da43a6 100644 --- a/test/libsolidity/SMTCheckerTest.cpp +++ b/test/libsolidity/SMTCheckerTest.cpp @@ -140,6 +140,7 @@ TestCase::TestResult SMTCheckerTest::run(ostream& _stream, string const& _linePr void SMTCheckerTest::filterObtainedErrors() { SyntaxTest::filterObtainedErrors(); + m_unfilteredErrorList = m_errorList; static auto removeCex = [](vector& errors) { for (auto& e: errors) @@ -156,3 +157,10 @@ void SMTCheckerTest::filterObtainedErrors() removeCex(m_errorList); } } + +void SMTCheckerTest::printUpdatedExpectations(ostream &_stream, const string &_linePrefix) const { + if (!m_unfilteredErrorList.empty()) + printErrorList(_stream, m_unfilteredErrorList, _linePrefix, false); + else + CommonSyntaxTest::printUpdatedExpectations(_stream, _linePrefix); +} diff --git a/test/libsolidity/SMTCheckerTest.h b/test/libsolidity/SMTCheckerTest.h index 965705f30c77..459a6c5656a6 100644 --- a/test/libsolidity/SMTCheckerTest.h +++ b/test/libsolidity/SMTCheckerTest.h @@ -42,6 +42,8 @@ class SMTCheckerTest: public SyntaxTest void filterObtainedErrors() override; + void printUpdatedExpectations(std::ostream& _stream, std::string const& _linePrefix) const override; + protected: /* Options that can be set in the test: @@ -62,6 +64,8 @@ class SMTCheckerTest: public SyntaxTest ModelCheckerSettings m_modelCheckerSettings; bool m_ignoreCex = false; + + std::vector m_unfilteredErrorList; }; } From cdfc19b5032d3d9e2e5f77003a379da4bb1ae00b Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Mon, 24 Jul 2023 18:33:43 +0200 Subject: [PATCH 012/150] SMTChecker: Bring back counterexample checks in regression tests Since the default is now to ignore the counterexamples when checking test output, we bring back counterexample checks in tests where the counterexample is (mostly) deterministic. --- .../array_members/pop_1_unsafe.sol | 1 + .../array_members/pop_constructor_unsafe.sol | 1 + .../array_members/push_zero_unsafe.sol | 3 ++- .../control_flow/short_circuit_and_fail.sol | 3 ++- .../short_circuit_and_need_both_fail.sol | 3 ++- .../control_flow/short_circuit_or_fail.sol | 3 ++- .../short_circuit_or_need_both_fail.sol | 3 ++- .../external_calls/call_mutex_unsafe.sol | 4 ++-- .../external_calls/external_reentrancy_2.sol | 3 ++- .../underflow_only_in_external_call.sol | 3 ++- .../smtCheckerTests/file_level/easy.sol | 3 ++- .../smtCheckerTests/file_level/struct.sol | 5 +++-- .../functions/functions_identity_1_fail.sol | 1 + .../functions/functions_identity_2_fail.sol | 1 + .../functions/getters/array_2.sol | 4 ++-- .../functions/getters/array_of_structs_2.sol | 3 ++- .../functions/getters/mapping_1.sol | 3 ++- .../functions/getters/mapping_2.sol | 3 ++- .../functions/getters/struct_1.sol | 3 ++- .../functions/getters/struct_2.sol | 3 ++- .../getters/struct_with_reassignment.sol | 5 +++-- .../functions/getters/uint.sol | 3 ++- .../functions/super_function_assert.sol | 5 +++-- .../base_contract_assertion_fail_1.sol | 3 ++- .../base_contract_assertion_fail_2.sol | 3 ++- .../base_contract_assertion_fail_3.sol | 3 ++- .../base_contract_assertion_fail_4.sol | 3 ++- .../base_contract_assertion_fail_5.sol | 3 ++- .../base_contract_assertion_fail_6.sol | 3 ++- .../base_contract_assertion_fail_7.sol | 3 ++- .../base_contract_assertion_fail_8.sol | 1 + .../base_contract_assertion_fail_9.sol | 5 +++-- .../inheritance/diamond_super_1.sol | 3 ++- .../inheritance/diamond_super_2.sol | 5 +++-- .../inheritance/diamond_super_3.sol | 3 ++- .../loops/while_loop_simple_1.sol | 1 + .../assignment_chain_tuple_contract_2.sol | 5 ++++- .../assignment_chain_tuple_contract_3.sol | 7 ++++-- .../operators/bitwise_and_int.sol | 11 +++++----- .../operators/shifts/shift_cex.sol | 22 +++++++++++++++++++ .../smtCheckerTests/operators/unary_add.sol | 3 ++- .../smtCheckerTests/operators/unary_sub.sol | 3 ++- .../out_of_bounds/fixed_bytes_2.sol | 1 + .../smtCheckerTests/simple/cex_smoke_test.sol | 12 ++++++++++ .../smtCheckerTests/try_catch/try_3.sol | 3 ++- .../smtCheckerTests/types/array_literal_2.sol | 3 ++- .../smtCheckerTests/types/array_literal_3.sol | 1 + .../smtCheckerTests/types/array_literal_5.sol | 3 ++- .../smtCheckerTests/types/array_literal_6.sol | 5 +++-- .../smtCheckerTests/types/bool_simple_1.sol | 1 + .../smtCheckerTests/types/mapping_1_fail.sol | 1 + .../struct/struct_constructor_named_args.sol | 3 ++- .../smtCheckerTests/types/tuple_function.sol | 1 + .../types/tuple_function_2.sol | 3 ++- .../types/tuple_function_3.sol | 5 +++-- .../smtCheckerTests/userTypes/constant.sol | 3 ++- 56 files changed, 147 insertions(+), 57 deletions(-) create mode 100644 test/libsolidity/smtCheckerTests/operators/shifts/shift_cex.sol create mode 100644 test/libsolidity/smtCheckerTests/simple/cex_smoke_test.sol diff --git a/test/libsolidity/smtCheckerTests/array_members/pop_1_unsafe.sol b/test/libsolidity/smtCheckerTests/array_members/pop_1_unsafe.sol index 270fa28fbad6..833983469195 100644 --- a/test/libsolidity/smtCheckerTests/array_members/pop_1_unsafe.sol +++ b/test/libsolidity/smtCheckerTests/array_members/pop_1_unsafe.sol @@ -6,5 +6,6 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- // Warning 2529: (49-56): CHC: Empty array "pop" happens here.\nCounterexample:\na = []\n\nTransaction trace:\nC.constructor()\nState: a = []\nC.f() diff --git a/test/libsolidity/smtCheckerTests/array_members/pop_constructor_unsafe.sol b/test/libsolidity/smtCheckerTests/array_members/pop_constructor_unsafe.sol index 1cb1ed013730..7e1eb8b694e8 100644 --- a/test/libsolidity/smtCheckerTests/array_members/pop_constructor_unsafe.sol +++ b/test/libsolidity/smtCheckerTests/array_members/pop_constructor_unsafe.sol @@ -6,5 +6,6 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- // Warning 2529: (43-50): CHC: Empty array "pop" happens here.\nCounterexample:\na = []\n\nTransaction trace:\nC.constructor() diff --git a/test/libsolidity/smtCheckerTests/array_members/push_zero_unsafe.sol b/test/libsolidity/smtCheckerTests/array_members/push_zero_unsafe.sol index aab7b5b78cfb..ed846fae090e 100644 --- a/test/libsolidity/smtCheckerTests/array_members/push_zero_unsafe.sol +++ b/test/libsolidity/smtCheckerTests/array_members/push_zero_unsafe.sol @@ -7,6 +7,7 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (61-91): CHC: Assertion violation happens here. +// Warning 6328: (61-91): CHC: Assertion violation happens here.\nCounterexample:\na = [0]\n\nTransaction trace:\nC.constructor()\nState: a = []\nC.f() // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/control_flow/short_circuit_and_fail.sol b/test/libsolidity/smtCheckerTests/control_flow/short_circuit_and_fail.sol index 0935d29c6439..a38ffdf8a957 100644 --- a/test/libsolidity/smtCheckerTests/control_flow/short_circuit_and_fail.sol +++ b/test/libsolidity/smtCheckerTests/control_flow/short_circuit_and_fail.sol @@ -14,6 +14,7 @@ contract c { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (194-203): CHC: Assertion violation happens here. +// Warning 6328: (194-203): CHC: Assertion violation happens here.\nCounterexample:\nx = 1\n = false\nb = false\n\nTransaction trace:\nc.constructor()\nState: x = 0\nc.g()\n c.f() -- internal call\n c.f() -- internal call // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/control_flow/short_circuit_and_need_both_fail.sol b/test/libsolidity/smtCheckerTests/control_flow/short_circuit_and_need_both_fail.sol index d21d8e041287..a5337675eb55 100644 --- a/test/libsolidity/smtCheckerTests/control_flow/short_circuit_and_need_both_fail.sol +++ b/test/libsolidity/smtCheckerTests/control_flow/short_circuit_and_need_both_fail.sol @@ -14,6 +14,7 @@ contract c { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (192-202): CHC: Assertion violation happens here. +// Warning 6328: (192-202): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n = false\nb = true\n\nTransaction trace:\nc.constructor()\nState: x = 0\nc.g()\n c.f() -- internal call\n c.f() -- internal call // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/control_flow/short_circuit_or_fail.sol b/test/libsolidity/smtCheckerTests/control_flow/short_circuit_or_fail.sol index 8ac219ae5434..c60dcc11319c 100644 --- a/test/libsolidity/smtCheckerTests/control_flow/short_circuit_or_fail.sol +++ b/test/libsolidity/smtCheckerTests/control_flow/short_circuit_or_fail.sol @@ -14,6 +14,7 @@ contract c { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (192-202): CHC: Assertion violation happens here. +// Warning 6328: (192-202): CHC: Assertion violation happens here.\nCounterexample:\nx = 1\n = false\nb = true\n\nTransaction trace:\nc.constructor()\nState: x = 0\nc.g()\n c.f() -- internal call\n c.f() -- internal call // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/control_flow/short_circuit_or_need_both_fail.sol b/test/libsolidity/smtCheckerTests/control_flow/short_circuit_or_need_both_fail.sol index ea71f34b051a..e528cf49dfec 100644 --- a/test/libsolidity/smtCheckerTests/control_flow/short_circuit_or_need_both_fail.sol +++ b/test/libsolidity/smtCheckerTests/control_flow/short_circuit_or_need_both_fail.sol @@ -14,6 +14,7 @@ contract c { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (192-202): CHC: Assertion violation happens here. +// Warning 6328: (192-202): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n = false\nb = true\n\nTransaction trace:\nc.constructor()\nState: x = 0\nc.g()\n c.f() -- internal call\n c.f() -- internal call // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/external_calls/call_mutex_unsafe.sol b/test/libsolidity/smtCheckerTests/external_calls/call_mutex_unsafe.sol index 64494971a2e0..e8c17d3eb05f 100644 --- a/test/libsolidity/smtCheckerTests/external_calls/call_mutex_unsafe.sol +++ b/test/libsolidity/smtCheckerTests/external_calls/call_mutex_unsafe.sol @@ -21,7 +21,7 @@ contract C { } // ==== // SMTEngine: all -// SMTIgnoreCex: yes +// SMTIgnoreCex: no // ---- // Warning 9302: (212-228): Return value of low-level calls not used. -// Warning 6328: (232-246): CHC: Assertion violation happens here. +// Warning 6328: (232-246): CHC: Assertion violation happens here.\nCounterexample:\nx = 0, lock = false\n_a = 0x0\ny = 1\n\nTransaction trace:\nC.constructor()\nState: x = 0, lock = false\nC.set(1)\nState: x = 1, lock = false\nC.f(0x0)\n _a.call("aaaaa") -- untrusted external call, synthesized as:\n C.set(0) -- reentrant call diff --git a/test/libsolidity/smtCheckerTests/external_calls/external_reentrancy_2.sol b/test/libsolidity/smtCheckerTests/external_calls/external_reentrancy_2.sol index 268db82b4632..1783be78141e 100644 --- a/test/libsolidity/smtCheckerTests/external_calls/external_reentrancy_2.sol +++ b/test/libsolidity/smtCheckerTests/external_calls/external_reentrancy_2.sol @@ -12,5 +12,6 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (117-131): CHC: Assertion violation happens here. +// Warning 6328: (117-131): CHC: Assertion violation happens here.\nCounterexample:\nlocked = false\ntarget = 0x0\n\nTransaction trace:\nC.constructor()\nState: locked = true\nC.call(0x0)\n D(target).e() -- untrusted external call, synthesized as:\n C.call(0x0) -- reentrant call diff --git a/test/libsolidity/smtCheckerTests/external_calls/underflow_only_in_external_call.sol b/test/libsolidity/smtCheckerTests/external_calls/underflow_only_in_external_call.sol index a0c3a06b4d9a..0b5c8fa07d73 100644 --- a/test/libsolidity/smtCheckerTests/external_calls/underflow_only_in_external_call.sol +++ b/test/libsolidity/smtCheckerTests/external_calls/underflow_only_in_external_call.sol @@ -18,6 +18,7 @@ contract C { } // ==== // SMTEngine: chc +// SMTIgnoreCex: no // SMTTargets: underflow // ---- -// Warning 3944: (109-112): CHC: Underflow (resulting value less than 0) happens here. +// Warning 3944: (109-112): CHC: Underflow (resulting value less than 0) happens here.\nCounterexample:\nv = 0, guard = false\n = 0\n\nTransaction trace:\nC.constructor()\nState: v = 0, guard = true\nC.f()\n C.dec() -- trusted external call diff --git a/test/libsolidity/smtCheckerTests/file_level/easy.sol b/test/libsolidity/smtCheckerTests/file_level/easy.sol index 07ad9f0793e0..2cbef3f5cc82 100644 --- a/test/libsolidity/smtCheckerTests/file_level/easy.sol +++ b/test/libsolidity/smtCheckerTests/file_level/easy.sol @@ -13,6 +13,7 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (222-239): CHC: Assertion violation happens here. +// Warning 6328: (222-239): CHC: Assertion violation happens here.\nCounterexample:\n\n\nTransaction trace:\nC.constructor()\nC.g()\n C.f(7) -- internal call\n add(7, 2) -- internal call\n C.f(8) -- internal call\n add(8, 2) -- internal call // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/file_level/struct.sol b/test/libsolidity/smtCheckerTests/file_level/struct.sol index 664e1ac5fee4..f469933dbaf8 100644 --- a/test/libsolidity/smtCheckerTests/file_level/struct.sol +++ b/test/libsolidity/smtCheckerTests/file_level/struct.sol @@ -22,7 +22,8 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (317-333): CHC: Assertion violation happens here. -// Warning 6328: (352-371): CHC: Assertion violation happens here. +// Warning 6328: (317-333): CHC: Assertion violation happens here.\nCounterexample:\n\ns = {x: 2, a: [1]}\n\nTransaction trace:\nC.constructor()\nC.f()\n allocate(2, 1) -- internal call +// Warning 6328: (352-371): CHC: Assertion violation happens here.\nCounterexample:\n\ns = {x: 2, a: [1]}\n\nTransaction trace:\nC.constructor()\nC.f()\n allocate(2, 1) -- internal call // Info 1391: CHC: 5 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/functions/functions_identity_1_fail.sol b/test/libsolidity/smtCheckerTests/functions/functions_identity_1_fail.sol index ceb42881ff3b..414a8a52bca7 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_identity_1_fail.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_identity_1_fail.sol @@ -11,5 +11,6 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- // Warning 6328: (129-142): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 0\n\nTransaction trace:\nC.constructor()\nC.g()\n C.h(0) -- internal call diff --git a/test/libsolidity/smtCheckerTests/functions/functions_identity_2_fail.sol b/test/libsolidity/smtCheckerTests/functions/functions_identity_2_fail.sol index 4d6ff0a64711..955f6906ce4e 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_identity_2_fail.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_identity_2_fail.sol @@ -15,5 +15,6 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- // Warning 6328: (197-210): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 0\n\nTransaction trace:\nC.constructor()\nC.g()\n C.h(0) -- internal call\n C.k(0) -- internal call diff --git a/test/libsolidity/smtCheckerTests/functions/getters/array_2.sol b/test/libsolidity/smtCheckerTests/functions/getters/array_2.sol index 3c9fc7eb8050..2d92413d5e24 100644 --- a/test/libsolidity/smtCheckerTests/functions/getters/array_2.sol +++ b/test/libsolidity/smtCheckerTests/functions/getters/array_2.sol @@ -17,7 +17,7 @@ contract C { } // ==== // SMTEngine: all -// SMTIgnoreCex: yes +// SMTIgnoreCex: no // ---- -// Warning 6328: (242-256): CHC: Assertion violation happens here. +// Warning 6328: (242-256): CHC: Assertion violation happens here.\nCounterexample:\na = [[], [], [0, 0, 0, 0]]\ny = 0\n\nTransaction trace:\nC.constructor()\nState: a = [[], [], [0, 0, 0, 0]]\nC.f() // Info 1391: CHC: 7 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/functions/getters/array_of_structs_2.sol b/test/libsolidity/smtCheckerTests/functions/getters/array_of_structs_2.sol index 36ea9da2fe07..b62611b5190d 100644 --- a/test/libsolidity/smtCheckerTests/functions/getters/array_of_structs_2.sol +++ b/test/libsolidity/smtCheckerTests/functions/getters/array_of_structs_2.sol @@ -18,6 +18,7 @@ contract D { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (267-281): CHC: Assertion violation happens here. +// Warning 6328: (267-281): CHC: Assertion violation happens here.\nCounterexample:\nitems = [{x: 42, y: 43}]\na = 42\nb = 43\n\nTransaction trace:\nD.constructor()\nState: items = []\nD.test() // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/functions/getters/mapping_1.sol b/test/libsolidity/smtCheckerTests/functions/getters/mapping_1.sol index 1077c2ee23e3..4dbd6a489a46 100644 --- a/test/libsolidity/smtCheckerTests/functions/getters/mapping_1.sol +++ b/test/libsolidity/smtCheckerTests/functions/getters/mapping_1.sol @@ -9,6 +9,7 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (142-156): CHC: Assertion violation happens here. +// Warning 6328: (142-156): CHC: Assertion violation happens here.\nCounterexample:\n\ny = 0\n\nTransaction trace:\nC.constructor()\nC.f() // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/functions/getters/mapping_2.sol b/test/libsolidity/smtCheckerTests/functions/getters/mapping_2.sol index c97084164f1d..418515a20889 100644 --- a/test/libsolidity/smtCheckerTests/functions/getters/mapping_2.sol +++ b/test/libsolidity/smtCheckerTests/functions/getters/mapping_2.sol @@ -9,6 +9,7 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (166-180): CHC: Assertion violation happens here. +// Warning 6328: (166-180): CHC: Assertion violation happens here.\nCounterexample:\n\ny = 0\n\nTransaction trace:\nC.constructor()\nC.f() // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/functions/getters/struct_1.sol b/test/libsolidity/smtCheckerTests/functions/getters/struct_1.sol index 521f108e0cd2..06c021706bd5 100644 --- a/test/libsolidity/smtCheckerTests/functions/getters/struct_1.sol +++ b/test/libsolidity/smtCheckerTests/functions/getters/struct_1.sol @@ -26,6 +26,7 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (338-355): CHC: Assertion violation happens here. +// Warning 6328: (338-355): CHC: Assertion violation happens here.\nCounterexample:\ns = {x: 0, t: {t: 0}, b: false, a: []}\ny = 0\nc = false\nt = {t: 0}\n\nTransaction trace:\nC.constructor()\nState: s = {x: 0, t: {t: 0}, b: false, a: []}\nC.f() // Info 1391: CHC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/functions/getters/struct_2.sol b/test/libsolidity/smtCheckerTests/functions/getters/struct_2.sol index eec69480a5d7..b43df21fcb9c 100644 --- a/test/libsolidity/smtCheckerTests/functions/getters/struct_2.sol +++ b/test/libsolidity/smtCheckerTests/functions/getters/struct_2.sol @@ -16,6 +16,7 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (175-189): CHC: Assertion violation happens here. +// Warning 6328: (175-189): CHC: Assertion violation happens here.\nCounterexample:\ns = {a: [0, 0], u: 0}\nu = 0\n\nTransaction trace:\nC.constructor()\nState: s = {a: [0, 0], u: 0}\nC.f() // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/functions/getters/struct_with_reassignment.sol b/test/libsolidity/smtCheckerTests/functions/getters/struct_with_reassignment.sol index 4f4f8e13c0d2..a322f4fb41ac 100644 --- a/test/libsolidity/smtCheckerTests/functions/getters/struct_with_reassignment.sol +++ b/test/libsolidity/smtCheckerTests/functions/getters/struct_with_reassignment.sol @@ -27,7 +27,8 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (255-272): CHC: Assertion violation happens here. -// Warning 6328: (377-391): CHC: Assertion violation happens here. +// Warning 6328: (255-272): CHC: Assertion violation happens here.\nCounterexample:\ns = {x: 1, b: false}\nx = 1\nb = false\ny = 0\nc = false\n\nTransaction trace:\nC.constructor()\nState: s = {x: 1, b: false}\nC.f() +// Warning 6328: (377-391): CHC: Assertion violation happens here.\nCounterexample:\ns = {x: 42, b: false}\nx = 1\nb = false\ny = 42\nc = false\n\nTransaction trace:\nC.constructor()\nState: s = {x: 1, b: false}\nC.f() // Info 1391: CHC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/functions/getters/uint.sol b/test/libsolidity/smtCheckerTests/functions/getters/uint.sol index 35a781dd7611..d05753dd7c54 100644 --- a/test/libsolidity/smtCheckerTests/functions/getters/uint.sol +++ b/test/libsolidity/smtCheckerTests/functions/getters/uint.sol @@ -9,6 +9,7 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (114-128): CHC: Assertion violation happens here. +// Warning 6328: (114-128): CHC: Assertion violation happens here.\nCounterexample:\nx = 0\ny = 0\n\nTransaction trace:\nC.constructor()\nState: x = 0\nC.f() // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/functions/super_function_assert.sol b/test/libsolidity/smtCheckerTests/functions/super_function_assert.sol index 3bec690e64e0..e0b191573307 100644 --- a/test/libsolidity/smtCheckerTests/functions/super_function_assert.sol +++ b/test/libsolidity/smtCheckerTests/functions/super_function_assert.sol @@ -28,7 +28,8 @@ contract D is C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (205-219): CHC: Assertion violation happens here. -// Warning 6328: (328-342): CHC: Assertion violation happens here. +// Warning 6328: (205-219): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nC.constructor()\nState: x = 0\nA.proxy()\n C.f() -- internal call\n A.f() -- internal call +// Warning 6328: (328-342): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nD.constructor()\nState: x = 0\nA.proxy()\n D.f() -- internal call\n C.f() -- internal call\n A.f() -- internal call // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_1.sol b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_1.sol index 587a23bb0207..6ecfed7914a6 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_1.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_1.sol @@ -14,6 +14,7 @@ contract C is B { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (52-66): CHC: Assertion violation happens here. +// Warning 6328: (52-66): CHC: Assertion violation happens here.\nCounterexample:\ny = 0, x = 1\n\nTransaction trace:\nC.constructor()\nState: y = 0, x = 0\nC.g()\n B.f() -- internal call // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_2.sol b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_2.sol index 97c79428b760..85e2677f782a 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_2.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_2.sol @@ -21,6 +21,7 @@ contract C is B { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (54-68): CHC: Assertion violation happens here. +// Warning 6328: (54-68): CHC: Assertion violation happens here.\nCounterexample:\ny = 0, z = 0, w = 0, a = 0, b = 0, x = 1\n\nTransaction trace:\nC.constructor()\nState: y = 0, z = 0, w = 0, a = 0, b = 0, x = 0\nC.g()\n A.f() -- internal call // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_3.sol b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_3.sol index c92b0c5014ef..f1481197f11f 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_3.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_3.sol @@ -27,6 +27,7 @@ contract C is B { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (64-78): CHC: Assertion violation happens here. +// Warning 6328: (64-78): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nC.constructor()\nState: x = 0\nC.g()\n B.f() -- internal call\n A.f() -- internal call\n C.v() -- internal call // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_4.sol b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_4.sol index 593a6ba3aa84..04b7ea7480e9 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_4.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_4.sol @@ -34,6 +34,7 @@ contract C is B, A1 { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (64-78): CHC: Assertion violation happens here. +// Warning 6328: (64-78): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nC.constructor()\nState: x = 0\nC.g()\n C.f() -- internal call\n A1.f() -- internal call\n B.f() -- internal call\n A.f() -- internal call\n C.v() -- internal call // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_5.sol b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_5.sol index 818906cd3a55..e386c4b445b3 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_5.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_5.sol @@ -28,6 +28,7 @@ contract C is B { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (97-111): CHC: Assertion violation happens here. +// Warning 6328: (97-111): CHC: Assertion violation happens here.\nCounterexample:\nx = 0\n\nTransaction trace:\nC.constructor()\nState: x = 0\nC.g()\n B.f() -- internal call\n A.f() -- internal call\n C.v() -- internal call\n A.v() -- internal call // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_6.sol b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_6.sol index 04033a00f0de..2bac9303b275 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_6.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_6.sol @@ -30,6 +30,7 @@ contract C is B { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (183-197): CHC: Assertion violation happens here. +// Warning 6328: (183-197): CHC: Assertion violation happens here.\nCounterexample:\nx = 0\n\nTransaction trace:\nA.constructor()\nState: x = 0\nA.g()\n A.v() -- internal call // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_7.sol b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_7.sol index e33e6a3bc0f8..45cf7fe186ad 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_7.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_7.sol @@ -21,6 +21,7 @@ contract C is A { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (56-70): CHC: Assertion violation happens here. +// Warning 6328: (56-70): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nC.constructor()\nState: x = 0\nC.g()\n A.f() -- internal call\n C.v() -- internal call // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_8.sol b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_8.sol index a326ccf3bca8..068531b4482e 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_8.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_8.sol @@ -14,5 +14,6 @@ contract C is A { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- // Warning 6328: (61-75): CHC: Assertion violation happens here.\nCounterexample:\nx = 0\n\nTransaction trace:\nC.constructor()\nState: x = 0\nA.f() diff --git a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_9.sol b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_9.sol index 2ec47f7d94f9..9972c7e3ff26 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_9.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/base_contract_assertion_fail_9.sol @@ -27,7 +27,8 @@ contract C is B { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (62-76): CHC: Assertion violation happens here. -// Warning 6328: (131-145): CHC: Assertion violation happens here. +// Warning 6328: (62-76): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nC.constructor()\nState: x = 0\nB.f()\n A.f() -- internal call\n C.v() -- internal call +// Warning 6328: (131-145): CHC: Assertion violation happens here.\nCounterexample:\nx = 0\n\nTransaction trace:\nA.constructor()\nState: x = 0\nA.f()\n A.v() -- internal call // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/inheritance/diamond_super_1.sol b/test/libsolidity/smtCheckerTests/inheritance/diamond_super_1.sol index 7af69f2e4aed..546f934b70fb 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/diamond_super_1.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/diamond_super_1.sol @@ -28,6 +28,7 @@ contract D is B, C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (437-452): CHC: Assertion violation happens here. +// Warning 6328: (437-452): CHC: Assertion violation happens here.\nCounterexample:\n\nr = 15\n\nTransaction trace:\nD.constructor()\nD.f()\n C.f() -- internal call\n B.f() -- internal call\n A.f() -- internal call // Info 1391: CHC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/inheritance/diamond_super_2.sol b/test/libsolidity/smtCheckerTests/inheritance/diamond_super_2.sol index c5f838397375..1825098a8063 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/diamond_super_2.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/diamond_super_2.sol @@ -29,7 +29,8 @@ contract D is B, C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (443-458): CHC: Assertion violation happens here. -// Warning 6328: (477-492): CHC: Assertion violation happens here. +// Warning 6328: (443-458): CHC: Assertion violation happens here.\nCounterexample:\n\nr = 22\n\nTransaction trace:\nD.constructor()\nD.f()\n C.f() -- internal call\n B.f() -- internal call\n A.f() -- internal call +// Warning 6328: (477-492): CHC: Assertion violation happens here.\nCounterexample:\n\nr = 22\n\nTransaction trace:\nD.constructor()\nD.f()\n C.f() -- internal call\n B.f() -- internal call\n A.f() -- internal call // Info 1391: CHC: 5 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/inheritance/diamond_super_3.sol b/test/libsolidity/smtCheckerTests/inheritance/diamond_super_3.sol index af22069eb66f..f6674021ebf0 100644 --- a/test/libsolidity/smtCheckerTests/inheritance/diamond_super_3.sol +++ b/test/libsolidity/smtCheckerTests/inheritance/diamond_super_3.sol @@ -31,6 +31,7 @@ contract E is C,D { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (379-394): CHC: Assertion violation happens here. +// Warning 6328: (379-394): CHC: Assertion violation happens here.\nCounterexample:\nx = 111\n\nTransaction trace:\nE.constructor()\nState: x = 0\nE.f()\n C.f() -- internal call\n B.f() -- internal call\n A.f() -- internal call // Info 1391: CHC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_loop_simple_1.sol b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_1.sol index 59edfb55b649..461e4f4e68d4 100644 --- a/test/libsolidity/smtCheckerTests/loops/while_loop_simple_1.sol +++ b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_1.sol @@ -11,5 +11,6 @@ contract C { // ==== // SMTEngine: all // SMTSolvers: z3 +// SMTIgnoreCex: no // ---- // Warning 6328: (162-176): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 1\n\nTransaction trace:\nC.constructor()\nC.f(0) diff --git a/test/libsolidity/smtCheckerTests/operators/assignment_chain_tuple_contract_2.sol b/test/libsolidity/smtCheckerTests/operators/assignment_chain_tuple_contract_2.sol index 461761bafa8b..c89314e0fdc8 100644 --- a/test/libsolidity/smtCheckerTests/operators/assignment_chain_tuple_contract_2.sol +++ b/test/libsolidity/smtCheckerTests/operators/assignment_chain_tuple_contract_2.sol @@ -9,6 +9,9 @@ contract C { assert(x != 2); // should fail } } +// ==== +// SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (174-188): CHC: Assertion violation happens here. +// Warning 6328: (174-188): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nC.constructor()\nState: x = 2\nC.g() // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/operators/assignment_chain_tuple_contract_3.sol b/test/libsolidity/smtCheckerTests/operators/assignment_chain_tuple_contract_3.sol index 6496ec525bf0..e53436a0f66c 100644 --- a/test/libsolidity/smtCheckerTests/operators/assignment_chain_tuple_contract_3.sol +++ b/test/libsolidity/smtCheckerTests/operators/assignment_chain_tuple_contract_3.sol @@ -17,7 +17,10 @@ contract D is C { assert(y == 3); // should hold } } +// ==== +// SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (95-109): CHC: Assertion violation happens here. -// Warning 6328: (180-194): CHC: Assertion violation happens here. +// Warning 6328: (95-109): CHC: Assertion violation happens here.\nCounterexample:\ny = 3, x = 3\n\nTransaction trace:\nD.constructor()\nState: y = 3, x = 3\nC.f() +// Warning 6328: (180-194): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nC.constructor()\nState: x = 2\nC.g() // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/operators/bitwise_and_int.sol b/test/libsolidity/smtCheckerTests/operators/bitwise_and_int.sol index 4bae4f67b87c..b280038accfc 100644 --- a/test/libsolidity/smtCheckerTests/operators/bitwise_and_int.sol +++ b/test/libsolidity/smtCheckerTests/operators/bitwise_and_int.sol @@ -2,18 +2,19 @@ contract C { function f() public pure { int8 x = 1; int8 y = 0; - assert(x & y != 0); + assert(x & y != 0); // should fail x = -1; y = 3; - assert(x & y == 3); + assert(x & y == 3); // should hold y = -1; int8 z = x & y; - assert(z == -1); + assert(z == -1); // should hold y = 127; - assert(x & y == 127); + assert(x & y == 127); // should hold } } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (71-89): CHC: Assertion violation happens here. +// Warning 6328: (71-89): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 1\ny = 0\nz = 0\n\nTransaction trace:\nC.constructor()\nC.f() // Info 1391: CHC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/operators/shifts/shift_cex.sol b/test/libsolidity/smtCheckerTests/operators/shifts/shift_cex.sol new file mode 100644 index 000000000000..8670b79c060c --- /dev/null +++ b/test/libsolidity/smtCheckerTests/operators/shifts/shift_cex.sol @@ -0,0 +1,22 @@ +contract C { + function left() public pure { + uint x = 0x4266; + assert(x << 0x0 == 0x4266); + // Fails because the above is true. + assert(x << 0x0 == 0x4268); + } + + function right() public pure { + uint x = 0x4266; + assert(x >> 0x0 == 0x4266); + // Fails because the above is true. + assert(x >> 0x0 == 0x4268); + } +} +// ==== +// SMTEngine: all +// SMTIgnoreCex: no +// ---- +// Warning 6328: (133-159): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 16998\n\nTransaction trace:\nC.constructor()\nC.left() +// Warning 6328: (286-312): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 16998\n\nTransaction trace:\nC.constructor()\nC.right() +// Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/operators/unary_add.sol b/test/libsolidity/smtCheckerTests/operators/unary_add.sol index 9716624b2a15..571cd666c10b 100644 --- a/test/libsolidity/smtCheckerTests/operators/unary_add.sol +++ b/test/libsolidity/smtCheckerTests/operators/unary_add.sol @@ -13,6 +13,7 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (161-174): CHC: Assertion violation happens here. +// Warning 6328: (161-174): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 4\na = 3\nb = 3\n\nTransaction trace:\nC.constructor()\nC.f() // Info 1391: CHC: 5 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/operators/unary_sub.sol b/test/libsolidity/smtCheckerTests/operators/unary_sub.sol index adf70fe42ce1..86ec98062fcb 100644 --- a/test/libsolidity/smtCheckerTests/operators/unary_sub.sol +++ b/test/libsolidity/smtCheckerTests/operators/unary_sub.sol @@ -13,6 +13,7 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (161-174): CHC: Assertion violation happens here. +// Warning 6328: (161-174): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 3\na = 4\nb = 4\n\nTransaction trace:\nC.constructor()\nC.f() // Info 1391: CHC: 5 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/out_of_bounds/fixed_bytes_2.sol b/test/libsolidity/smtCheckerTests/out_of_bounds/fixed_bytes_2.sol index f4e90ddb7810..d51685f397d0 100644 --- a/test/libsolidity/smtCheckerTests/out_of_bounds/fixed_bytes_2.sol +++ b/test/libsolidity/smtCheckerTests/out_of_bounds/fixed_bytes_2.sol @@ -5,5 +5,6 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- // Warning 6368: (83-87): CHC: Out of bounds access happens here.\nCounterexample:\n\nx = 0x0\ny = 4\n = 0x0\n\nTransaction trace:\nC.constructor()\nC.r(0x0, 4) diff --git a/test/libsolidity/smtCheckerTests/simple/cex_smoke_test.sol b/test/libsolidity/smtCheckerTests/simple/cex_smoke_test.sol new file mode 100644 index 000000000000..a592331035f0 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/simple/cex_smoke_test.sol @@ -0,0 +1,12 @@ +contract C { + + function f() public pure { + uint x = 1; + assert(x == 2); + } +} +// ==== +// SMTEngine: all +// SMTIgnoreCex: yes +// ---- +// Warning 6328: (73-87): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 1\n\nTransaction trace:\nC.constructor()\nC.f() diff --git a/test/libsolidity/smtCheckerTests/try_catch/try_3.sol b/test/libsolidity/smtCheckerTests/try_catch/try_3.sol index 77e53f86088d..7698eed0f006 100644 --- a/test/libsolidity/smtCheckerTests/try_catch/try_3.sol +++ b/test/libsolidity/smtCheckerTests/try_catch/try_3.sol @@ -21,7 +21,8 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- // Warning 5667: (259-273): Unused try/catch parameter. Remove or comment out the variable name to silence this warning. -// Warning 6328: (280-294): CHC: Assertion violation happens here. +// Warning 6328: (280-294): CHC: Assertion violation happens here.\nCounterexample:\nx = 1\ns = []\n\nTransaction trace:\nC.constructor()\nState: x = 0\nC.f()\n C.postinc() -- internal call // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/types/array_literal_2.sol b/test/libsolidity/smtCheckerTests/types/array_literal_2.sol index 1136a9d1f3c9..d48644c2fd27 100644 --- a/test/libsolidity/smtCheckerTests/types/array_literal_2.sol +++ b/test/libsolidity/smtCheckerTests/types/array_literal_2.sol @@ -10,6 +10,7 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (167-187): CHC: Assertion violation happens here. +// Warning 6328: (167-187): CHC: Assertion violation happens here.\nCounterexample:\n\na = [1, 2, 3]\nb = [1, 2, 4]\n\nTransaction trace:\nC.constructor()\nC.f() // Info 1391: CHC: 8 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/types/array_literal_3.sol b/test/libsolidity/smtCheckerTests/types/array_literal_3.sol index 52baec977d6b..cdaff2bf44a4 100644 --- a/test/libsolidity/smtCheckerTests/types/array_literal_3.sol +++ b/test/libsolidity/smtCheckerTests/types/array_literal_3.sol @@ -9,6 +9,7 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- // Warning 6328: (168-188): CHC: Assertion violation happens here. // Info 1391: CHC: 8 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/types/array_literal_5.sol b/test/libsolidity/smtCheckerTests/types/array_literal_5.sol index 7c4c9d3d9a15..0a6fe02bc551 100644 --- a/test/libsolidity/smtCheckerTests/types/array_literal_5.sol +++ b/test/libsolidity/smtCheckerTests/types/array_literal_5.sol @@ -12,6 +12,7 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (176-196): CHC: Assertion violation happens here. +// Warning 6328: (176-196): CHC: Assertion violation happens here.\nCounterexample:\ns = [1, 2, 3]\na = [1, 2, 3]\n\nTransaction trace:\nC.constructor()\nState: s = []\nC.f() // Info 1391: CHC: 9 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/types/array_literal_6.sol b/test/libsolidity/smtCheckerTests/types/array_literal_6.sol index e612b08a280f..b017aa93e547 100644 --- a/test/libsolidity/smtCheckerTests/types/array_literal_6.sol +++ b/test/libsolidity/smtCheckerTests/types/array_literal_6.sol @@ -13,7 +13,8 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (146-174): CHC: Assertion violation happens here. -// Warning 6328: (235-255): CHC: Assertion violation happens here. +// Warning 6328: (146-174): CHC: Assertion violation happens here.\nCounterexample:\n\na = [1, 2, 3]\nb = [1, 2, 4, 3]\nc = [1, 2, 4, 3]\n\nTransaction trace:\nC.constructor()\nC.f() +// Warning 6328: (235-255): CHC: Assertion violation happens here.\nCounterexample:\n\na = [1, 2, 3]\nb = [1, 2, 4, 3]\nc = [1, 2, 4, 3]\n\nTransaction trace:\nC.constructor()\nC.f() // Info 1391: CHC: 11 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/types/bool_simple_1.sol b/test/libsolidity/smtCheckerTests/types/bool_simple_1.sol index 52b05f3bd236..a9ea6c7f9602 100644 --- a/test/libsolidity/smtCheckerTests/types/bool_simple_1.sol +++ b/test/libsolidity/smtCheckerTests/types/bool_simple_1.sol @@ -5,5 +5,6 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- // Warning 6328: (58-67): CHC: Assertion violation happens here.\nCounterexample:\n\nx = false\n\nTransaction trace:\nC.constructor()\nC.f(false) diff --git a/test/libsolidity/smtCheckerTests/types/mapping_1_fail.sol b/test/libsolidity/smtCheckerTests/types/mapping_1_fail.sol index d72f62be9e92..7e9669eaf246 100644 --- a/test/libsolidity/smtCheckerTests/types/mapping_1_fail.sol +++ b/test/libsolidity/smtCheckerTests/types/mapping_1_fail.sol @@ -9,5 +9,6 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- // Warning 6328: (101-120): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 3\n\nTransaction trace:\nC.constructor()\nC.f(3) diff --git a/test/libsolidity/smtCheckerTests/types/struct/struct_constructor_named_args.sol b/test/libsolidity/smtCheckerTests/types/struct/struct_constructor_named_args.sol index b12882ef7c26..d52a71697790 100644 --- a/test/libsolidity/smtCheckerTests/types/struct/struct_constructor_named_args.sol +++ b/test/libsolidity/smtCheckerTests/types/struct/struct_constructor_named_args.sol @@ -19,6 +19,7 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (232-255): CHC: Assertion violation happens here. +// Warning 6328: (232-255): CHC: Assertion violation happens here.\nCounterexample:\n\ninner = {x: 43}\nouter = {s: {x: 43}, y: 512}\n\nTransaction trace:\nC.constructor()\nC.test() // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/types/tuple_function.sol b/test/libsolidity/smtCheckerTests/types/tuple_function.sol index ef3ad0102adc..97156f5cfb6f 100644 --- a/test/libsolidity/smtCheckerTests/types/tuple_function.sol +++ b/test/libsolidity/smtCheckerTests/types/tuple_function.sol @@ -13,6 +13,7 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- // Warning 6328: (149-163): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 2\ny = 3\n\nTransaction trace:\nC.constructor()\nC.g()\n C.f() -- internal call // Warning 6328: (167-181): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 2\ny = 3\n\nTransaction trace:\nC.constructor()\nC.g()\n C.f() -- internal call diff --git a/test/libsolidity/smtCheckerTests/types/tuple_function_2.sol b/test/libsolidity/smtCheckerTests/types/tuple_function_2.sol index 362755ac96fd..62b73e904a93 100644 --- a/test/libsolidity/smtCheckerTests/types/tuple_function_2.sol +++ b/test/libsolidity/smtCheckerTests/types/tuple_function_2.sol @@ -13,6 +13,7 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (166-180): CHC: Assertion violation happens here. +// Warning 6328: (166-180): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 2\ny = 0\n\nTransaction trace:\nC.constructor()\nC.g()\n C.f() -- internal call // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/types/tuple_function_3.sol b/test/libsolidity/smtCheckerTests/types/tuple_function_3.sol index f33f9bfc8489..0e0c7bded915 100644 --- a/test/libsolidity/smtCheckerTests/types/tuple_function_3.sol +++ b/test/libsolidity/smtCheckerTests/types/tuple_function_3.sol @@ -15,7 +15,8 @@ contract C } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (172-186): CHC: Assertion violation happens here. -// Warning 6328: (190-204): CHC: Assertion violation happens here. +// Warning 6328: (172-186): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 0\ny = 0\nb = false\n\nTransaction trace:\nC.constructor()\nC.g()\n C.f() -- internal call +// Warning 6328: (190-204): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 0\ny = 0\nb = false\n\nTransaction trace:\nC.constructor()\nC.g()\n C.f() -- internal call // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/userTypes/constant.sol b/test/libsolidity/smtCheckerTests/userTypes/constant.sol index 0d49dec4bc20..baba50d07d99 100644 --- a/test/libsolidity/smtCheckerTests/userTypes/constant.sol +++ b/test/libsolidity/smtCheckerTests/userTypes/constant.sol @@ -14,6 +14,7 @@ contract C { } // ==== // SMTEngine: all +// SMTIgnoreCex: no // ---- -// Warning 6328: (531-555): CHC: Assertion violation happens here. +// Warning 6328: (531-555): CHC: Assertion violation happens here.\nCounterexample:\nu = 165521356710917456517261742455526507355687727119203895813322792776\n\nTransaction trace:\nC.constructor()\nState: u = 165521356710917456517261742455526507355687727119203895813322792776\nC.f() // Info 1391: CHC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. From 0fa594e50114911cab9a1d97908ab06882b17189 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 26 Jul 2023 06:17:38 -0700 Subject: [PATCH 013/150] fix docs layout and link bugs [Fixes #14436] (#14439) using cdnfonts import instead fix mobile menu layout fix mobile content positioning/sizing fix desktop content widths prevent header links from wrapping update desktop positioning fix backdrop-filter move to .unified-header::before feat: independent scrolling for content and menu --- docs/_static/css/custom.css | 95 ++++++++++-------- docs/_static/fonts/overpass-bold.otf | Bin 68828 -> 0 bytes docs/_static/fonts/overpass-bold.woff2 | Bin 38728 -> 0 bytes docs/_static/fonts/overpass-italic.otf | Bin 72500 -> 0 bytes docs/_static/fonts/overpass-light.otf | Bin 69324 -> 0 bytes docs/_static/fonts/overpass-mono-bold.otf | Bin 95240 -> 0 bytes docs/_static/fonts/overpass-mono-bold.woff2 | Bin 20532 -> 0 bytes docs/_static/fonts/overpass-mono-regular.otf | Bin 94520 -> 0 bytes .../_static/fonts/overpass-mono-regular.woff2 | Bin 20532 -> 0 bytes .../overpass-mono/overpass-mono-bold.otf | Bin 95240 -> 0 bytes .../overpass-mono/overpass-mono-regular.otf | Bin 94520 -> 0 bytes docs/_static/fonts/overpass-regular.otf | Bin 69808 -> 0 bytes docs/_static/fonts/overpass-regular.woff2 | Bin 38728 -> 0 bytes docs/_static/fonts/overpass-semibold.otf | Bin 65704 -> 0 bytes docs/_static/fonts/overpass/overpass-bold.otf | Bin 68828 -> 0 bytes .../fonts/overpass/overpass-italic.otf | Bin 72500 -> 0 bytes .../_static/fonts/overpass/overpass-light.otf | Bin 69324 -> 0 bytes .../fonts/overpass/overpass-regular.otf | Bin 69808 -> 0 bytes .../fonts/overpass/overpass-semibold.otf | Bin 65704 -> 0 bytes docs/_static/js/initialize.js | 18 +--- docs/conf.py | 2 +- 21 files changed, 53 insertions(+), 62 deletions(-) delete mode 100644 docs/_static/fonts/overpass-bold.otf delete mode 100644 docs/_static/fonts/overpass-bold.woff2 delete mode 100644 docs/_static/fonts/overpass-italic.otf delete mode 100644 docs/_static/fonts/overpass-light.otf delete mode 100644 docs/_static/fonts/overpass-mono-bold.otf delete mode 100644 docs/_static/fonts/overpass-mono-bold.woff2 delete mode 100644 docs/_static/fonts/overpass-mono-regular.otf delete mode 100644 docs/_static/fonts/overpass-mono-regular.woff2 delete mode 100644 docs/_static/fonts/overpass-mono/overpass-mono-bold.otf delete mode 100644 docs/_static/fonts/overpass-mono/overpass-mono-regular.otf delete mode 100644 docs/_static/fonts/overpass-regular.otf delete mode 100644 docs/_static/fonts/overpass-regular.woff2 delete mode 100644 docs/_static/fonts/overpass-semibold.otf delete mode 100644 docs/_static/fonts/overpass/overpass-bold.otf delete mode 100644 docs/_static/fonts/overpass/overpass-italic.otf delete mode 100644 docs/_static/fonts/overpass/overpass-light.otf delete mode 100644 docs/_static/fonts/overpass/overpass-regular.otf delete mode 100644 docs/_static/fonts/overpass/overpass-semibold.otf diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index 7519db8e1cc5..25ab26544318 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -16,6 +16,9 @@ --navHeight: 4.5rem; --sideWidth: 300px; + --maxWidth: 80rem; + --desktopInlinePadding: 2rem; + --mobileInlinePadding: 1rem; --currentVersionHeight: 45px; text-rendering: geometricPrecision; @@ -57,7 +60,6 @@ html, body, .wy-grid-for-nav { background-color: var(--color-f) !important; - position: relative; } body { @@ -68,6 +70,10 @@ a { color: var(--color-c); } +a, section { + scroll-margin-top: calc(var(--navHeight) + 2rem); +} + hr { margin-block: 2rem; border-color: var(--color-d) !important; @@ -328,7 +334,6 @@ ul.current ul, .wy-breadcrumbs-aside a, .wy-breadcrumbs-aside a:visited, -/* .wy-breadcrumbs-aside a:not(:visited), */ a.fa.fa-github, a.fa.fa-github:visited, a.fa.fa-github:not(:visited), @@ -362,10 +367,11 @@ footer .rst-footer-buttons { /* Site wrapper, and two children: header and rest */ .unified-wrapper { - position: fixed; + position: relative; + display: flex; + flex-direction: column; inset: 0; - top: var(--navHeight); - max-width: 80rem; + max-width: var(--maxWidth); margin-inline: auto; } @@ -378,17 +384,16 @@ footer .rst-footer-buttons { display: flex; align-items: center; box-shadow: var(--shadow); - backdrop-filter: blur(3px); } .unified-header .inner-header { display: flex; margin-inline: auto; width: 100%; - max-width: 80rem; + max-width: var(--maxWidth); align-items: center; justify-content: space-between; - padding-inline: 2rem; + padding-inline: var(--desktopInlinePadding); padding-block: 1rem; } @@ -399,6 +404,7 @@ footer .rst-footer-buttons { opacity: 95%; background: var(--color-f); z-index: -1; + backdrop-filter: blur(3px); } .unified-header .home-link { @@ -445,6 +451,7 @@ footer .rst-footer-buttons { font-weight: 400; box-sizing: content-box; border-bottom: 1px solid transparent; + white-space: nowrap; } .unified-header .nav-link.active { @@ -456,34 +463,36 @@ footer .rst-footer-buttons { border-bottom: 1px solid var(--color-c); } -/* Rest: Grid, with two children: side bar, and content */ +/* Rest: Flex-row, with two children: side bar, and content */ .unified-wrapper .wy-grid-for-nav { position: relative !important; - display: grid !important; - grid-template-columns: var(--sideWidth) 1fr; - gap: 1rem; + display: flex; + margin-inline: auto; } /* First child: Side bar */ .unified-wrapper .wy-grid-for-nav nav.wy-nav-side { - position: relative; + position: fixed; display: flex; flex-direction: column; background: var(--color-f); color: var(--color-a); - top: 0; - bottom: 0; - left: 0; padding-bottom: unset !important; - min-height: unset !important; z-index: 10 !important; - max-width: var(--sideWidth) !important; + min-height: unset !important; + width: var(--sideWidth) !important; + top: var(--navHeight); + bottom: 0; + left: auto; + overflow: auto; } .unified-wrapper .wy-grid-for-nav nav.wy-nav-side .wy-side-scroll { - position: relative !important; - width: fit-content !important; + position: static !important; + width: unset !important; + overflow: unset !important; height: unset !important; + padding-bottom: 2rem; } .unified-wrapper .wy-grid-for-nav nav.wy-nav-side .wy-side-scroll .wy-side-nav-search { @@ -517,15 +526,15 @@ footer .rst-footer-buttons { /* Second child: Content */ .unified-wrapper .wy-grid-for-nav .wy-nav-content { - position: relative !important; - overflow-y: scroll !important; width: 100%; - max-width: 100vw !important; - padding-inline: 2rem; + max-width: unset !important; /* override */ + padding-inline: var(--desktopInlinePadding); + margin-inline-start: var(--sideWidth); + margin-top: var(--navHeight); } .unified-wrapper .wy-grid-for-nav .wy-nav-content .rst-content { - max-width: 70ch; + max-width: min(70ch, calc(100vw - 2 * var(--desktopInlinePadding) - var(--sideWidth))); margin-inline: auto; } @@ -566,29 +575,15 @@ footer .rst-footer-buttons { } .unified-header .inner-header { - padding-inline: 1rem; - } - - .unified-wrapper .wy-grid-for-nav { - grid-template-columns: 1fr; + padding-inline: var(--mobileInlinePadding); } .unified-wrapper .wy-grid-for-nav nav.wy-nav-side { - position: absolute; - inset-block: 0; - inset-inline-start: 0; - width: var(--sideWidth); - overflow-y: scroll; transform: translateX(-100%); transition: transform 200ms ease-in-out; } /* Menu open styles */ - .unified-wrapper .wy-grid-for-nav nav.wy-nav-side { - position: absolute; - - } - .unified-wrapper.menu-open nav.wy-nav-side { transform: translateX(0); transition: transform 200ms ease-in-out; @@ -613,6 +608,18 @@ footer .rst-footer-buttons { a.skip-to-content { display: none; } + + .wy-nav-content { + margin-inline-start: 0 !important; + } + + .rst-content { + max-width: 100% !important; + } + + .wy-side-scroll { + padding-bottom: 0 !important; + } } ul.search .context { @@ -781,9 +788,8 @@ button.mobile-menu-button { font-family: 'Overpass Mono', monospace; } -.wy-breadcrumbs-aside { - display: block; - padding-top: 0; +.wy-breadcrumbs>li { + padding-top: 8px; } .wy-breadcrumbs-aside a { @@ -804,8 +810,9 @@ a.skip-to-content { padding: 2px 4px; font-size: 14px; margin-inline-end: auto; - margin-inline-start: 2rem; + margin-inline-start: 1.5rem; color: var(--color-a); + white-space: nowrap; } a.skip-to-content:focus { diff --git a/docs/_static/fonts/overpass-bold.otf b/docs/_static/fonts/overpass-bold.otf deleted file mode 100644 index 962a5d7628df54752943bc65a97c9aa656b7f6de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68828 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�W-gOcvg3HE~xxq{zXX~ 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 IKGdgV1zXGahX4Qo diff --git a/docs/_static/fonts/overpass-italic.otf b/docs/_static/fonts/overpass-italic.otf deleted file mode 100644 index 19224a86dc1d636bfd9aa978d4c776a2718590cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72500 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 diff --git a/docs/_static/fonts/overpass-light.otf b/docs/_static/fonts/overpass-light.otf deleted file mode 100644 index b060651a442a5e7fbe9425c4a7f0990b8ec6636d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69324 zcmdqKd0bT0|37}t9cBh+bWFxU1&0}MS3tmh7g>}$W3|9d6AS`)P1mYDQ)7ORqC_ zq$y+liw0+m7?fDu`7qV_J)4|W=qOIV5&I!ygXS~V_=P;D zBind*)g?ST2k4%M4F7|EwJ1Ls_pS2^OJ{r&n3K#HZ^)QFv(Pc4n17IlN9;I2SL7&k zc5E;mefxjKSg)6gT_vSA-)F;sFX3lrERFFGaK!-{#%31&eq~bQzJD-{=3C^jbGeZn zeCf^B|DNZ!+pn!sQleb^yTX{Xj;A>Y{vatET1>WwF%>W7-x%m*jI|cbtG)RJzlkz_Y?5XuXpDS?7esHA;}783Db|}$N4+S} zOn@H;KHe}^(|8as`f#_Sst;ZHc-1r!{CAK~Z&;1^2x0jdDC zw{Rm_sSm)5aH|Jt{AJ*F6LcGoaoB+0YVd0&c-Wn#X{NHF3IwoLpi?}c9q=yFjJx>@ z(Ox6&;AbSp-VNeWP@!H;wk%(%!dhs%l$%lTQ2WilW=FFSpXUkR!TZ3_M5f_C-Ba5>kPfmK&8w_E`C`rae}Bade&S~9n?wC}E8bc4 zx5_UpmY>v`hchia-Q)0Y43tz-K9LRMpfF>8N=fAhex2EUxA6(dBiR9Fzj;&o>81{S zwB@t#a2Y-4H!%(>OEtpyi?{miP7eX}>(9D-uO;-~-+QfLEm)lQ+7G^cy!Tqmg4tB> zwGR1nz1Mn-bD8(rpBb5Nj1AB`q9dg*1M3I=s@Fzl;jO&a4Z-W4-s?v9tmMPJ*Cys{ z@{{-4%rXNqFb?k50Bscnyz0H?tfkrPy_T5C+}V4rVKL@@-fO>lWwflj+2zgGA%Cs+ zTF=tV?|QHOSzyy9-s=WzVAFQqYXh6rG}n7=WF4D+?!9ivVk}1Qb)(SU7GJ+6R^7eA zn|}|xr$?;!x(PG%81B6`v-Lg3#kq=Sy7P1MO6?o$F;UUo?Nesj)1BG&A&$~;ds0zW zq&>Evz^;@ivAdlmPItL8J2JK0=`MDZlq6HlE|F1DQGG}l`uOrAln1^$yK*Iytz*P}$cNAq)rlX+5Wp|W2 z@(UbO3Y_)|5DX+vj2&)wl=e1w$5fK#&M(GbO7aULUGCh@sfo!3gP|4vsfeT{q}UTv zQ!?$zNpT4&83}enJw)sg_L%PWMCTNDnZrF3q>k!gFhoQ|cpFGdPlz2hC^-S>I_av%V<`&Nm1TqV;r2pTc76^C0bzz7F%ozFl(JIf5W)pB?NE>cS5Ypd=nMBC zc9E;pUg9c%=**q$LzbLB!eNe@snP7uEzg#6c4I0n097TlA6i9FZ zA>u5Y;>^ybtJ|>vUY%WTwKr83(Oij77rf*JsiAX9Pd@u&r@1Jk*^4a=o3OnTk$N~Q zB&d519P?Zi5FfXKEDag>x}6112eqYY9*s?5fxUEQv6CdsOLVnew{v<~zT2rtAH>JY zVlV=E4zSawzI7^X&vpT8>daAG4CI&v?M3L07%>#s>)=0ouwKA);rzpOFGz!jKP{^4b=a9o}&(I*9R{ zN%y)J)y$=U$MwfRq*D1_QtZs~3bxw0-H}u3HI*=XUVm0n3Tr`h#aO8IR5-ExB1eJG zY}Rj^=tJfMwu0;dSbZBQN&AakMQ95`S7NWPNPka1>T{S+1HBfqexG-!P9f|L39%zv zQLIu|IM`j_EQKh9+et~vroa%DmQhBH*IH1%Vq#nc&KgBrRa;sQU7vNmWANa|OnX+I zqX;C)g_yYu9c2I9lubs`CxEw;fdtlG)=ZAb79b+ z|J03>uAtMou#SavUFyurE6UFTM=IR;#6NVe>RU0y7Hp`O`8;U6@~@1RfAi*i$D)2o#E71;bUlO|AnLIoGLp2_mDn zf7g^!C^C`40X&Lf4OH^phJaED7D%Y>rdtRE`8J<==Rka26@)BEmJLVcDk|x1FhqB-r#Ru}z3Oor>M%ua#R6em z`CxxO>cOFvfg^PiMAqJZOLtJ=PML;o`}~^MYoIM>K@K<*)8RkYyz9t(t=;k-^@*nV zvcLBkihz+%_Bsux1HM;b9mx@xsX9+Y35XCVUk!a>k`Z(%MyZsnSbaNRf`Y0$^V+p+ zyO*A1`AT6CBOLId2vVFgN`1yIudL8f6oK#}TZyx1>6I)os0U(_v4I0{yNccU6wnj` zNvKC%@j_=QDwZOw$afZGmngvi)uRs3#1vRDgjT8{2NHE2+y!L4b-XykpXI|=m*+bx zKof{Qbq;BDgF9Uy8m_;v^Y3|rYD)FLnrYQrz|5D}oimC-z5G%|r%MqGL6_<&pjY#J zm}I%!@aZtEip`6=#SqmAd3_2>zyx?La}h-?@Sda>UV8vC!WV%c6!DRVARAqbTCh$e z2&(&|L6g_)+ChnAs2ri~Rp~psRvxLrw`$z#mAzeu5X?b?y%7XD@kNG(u2R?pXHmAx z4Z4w{Wh2}u&BqOym^-xyMQ3C=ixqWtWKAn_RUmT8RSAB}212Ln;c+*d$w3o~>mlt{ zgGuBfg7^>Y0d2aew7G47UgJe!BnDAuoD{o2A*)xaVXO-<;KH&JC6=o1Bf$p*N?_by zLn74(DwVt>tY7iYIIO;2!j}HOkH2oC1PG+KnoM#vDX|oD-9GD@;)L0x2(JthL7XUe z18SbJJ*dS+7Gh~(IGd)kO}Y*Zznjd(Phl9ZB|j$RUmC1ApchT>Aw z#-t|=9+DZ3N}0&SOg%j|K4DmF`p|H~Fcm{iw<|>=fhF3oCyb=Z8AD=|lkG&1TW#2f zq$bCs^q>S_AB$;3F)!P;r5KQgt#QS z0O^v_6XJj%N`l-NJaW+zqKk}#;UkcNa=tFWgCPkD>cBY`|HqMhs3T6n2&tXS)O66m zi^`~^jD&D|Y24D?lR};|P!tMImP@zQh*Fqi4$G`<6hU6xH?;EdKga;TK?}^xD%uL zE#CRejZ`u zJIP5Ns8R|ZW+_**Gp;Qr`II%%txU00*N$TIzK3u6y zR8)EBqraVHpzj>uTA}dKiC)zb1-JE0l3xZq2xm90iAz*A16q)bG!=9pJnJ}nC-%g} zJ7qK)<0UXC{JmShK5U4N#lT3_!6`@!kW-=Pp+mvTSJHteC3r@1S`Ns^y#qR2px|49 zd%|6n;zVffaOJubTr?oRK1WMHdy>RrA72J%ZG^rZTqYnX&{Z4WZw?#RLfL` zR2?-vRkfVPkJm^PtjY3|#QW;07^=9Jql`)qvZOf*PDCAFS)z@qOZ3d4(5XVfk*qBB zZwF0Dld}{__KlA$BUxjT5z-Li3)vynBGt7|obq9!>XX_gc_pGl5$d{?x+MG5mrrM0 zUYgQV(%L%7QYC}>AP$md5;i^#{MDA!$62L~ig6k05l%!qqHh_lRjsF-LbOcxIo`aw zF{xuzc|tln1vN&8~cV=6&(pl7%H1)t2Q(n}N}S`h9kAE*}fT|efrqcv56 ziRyRK*2irhZU2cPcc-)3JK=M;`YIhMdZ++yWPRL`VT4bo>-JL_XYbicc|%tlS( z0MT8QUkC6j#;AxpYP-I1P}wYCREJBQee{irz%D26B^gwaX_^dbsmZ$ z+C=!m6hJ0`{9^_)*jwI;3;zB{Y(F*yz|BeHyhLKNDC5e0>(cTv)tCUr(P6^s18}5@6m8U)%Uf*`8 z*4%~iZq!iijBkWwXUHT3m~=vo8&tmda8E@G zG=n3mkr%on+WcF*>-R~%ON}dhvnVw(siQ&$=yAJMRDC~19ppFFISq}9MoGSk@V?U{ z{V($88|N_ebh{6{Er$Htar*dkHyf!+Cq405Vv2sK7oYCC6q`vUh(Z*X(G!w9pC>7U z45|?kd2MeAdsC$(MQv(q;VVz|)hLGa%!zV7{8Wn9=L$tDw^R4_GXKDN1xuCUq-)fV zDkbFoRqIO{N3o<2JGHbglB}bGDxLpH8hjR(?5`6Z$By43XcJjS8iP-EecX&yXhq)1 z{a~XHrw(7;Gb#*jO^rYsgemWO-Pw;;TGVsX(}rJtKMbMT0(%t;z(==$y)P9|zSa==Slu&?;FW zk_ewvPz>+0SH3p?nF54~+LIas(Y-I;ovGmAYm=U+JoI5$7xSsleD*-CM`OR6-J!B1 z`>KZ^JuXmM_SN>yt$k(4+x<1(RsviMVO&D(sV_thmm^vxW6l%>81 zUv)-B*Com<-GDU%^2aH_LYdLG9QdfG_C|O-)^I@&l zR;|h3#q$(xQj0WB-|UR!!8g}aqo>>D(--p*o+M`xNY!~LwM7c;%&~HAdDqs-?hv-rBc&>C zB#+sOzW8R1zW#h8P_dYzv`l`V;@`Sa5uJ%gcbkK|@Pu$v<3(RTx6@gjpAn6yUD8$Z zv?|3_z447)wXJTi?sV~54Vqj1lXm_udZPALCwu9@iAM7uqUqb_78F^jy8=Wk4^L!DVk0zumZv01msc}_ZoEN9a$n9}={h3fCdd^fNhWMwp zp+*6;7U%QBWT|~?E$ZCU=Pz!L4^(L++4e~Y)uhq-<`6zfp^_>seV&}COnmf>%ExKn zx>Q$%*MuucldnDBOz!sh@t;OrSF8RUrC#KAi;K6n`=9)fx-zHwVBbt#^#STg$cCyT zR5h18G4Yj&{qdDm*C75k?NMXWZnw$J z-*Zs)-FL=LDktt1IZ=7lO8&!4$Qu=q6c8U&nYdd#M-oDkK-?znP&MwqS)(9ad^Dyt zYqh7_rSR{1tlz#*y6Vpt{?1>j*5dyU>tBB_6L-#PGH=alQm`B2Tj%;udtJnB(kb%0 zWMPZI9o0to_*IUlwEjxcM7mYSgZi3wXVi0N6ixL=X4H6?OKV~|5_(;j<@ayJy^Q_vpOO<<#yJ`&I-^_Plz)b}vt(q3DF zw;a`=QH;PnT@Oa7LEipSP>cGd@-zb_t^re|srdEvdOKFsvf3YErqU%2V^DF9MccG1 zN^Ol%@T9fQO!Vu+lXe6N(^vpL8pbtAM;tIBO4E}xT&LqV75xxBsb#{7u%%Vg6woAH zNeAOOVW93XsNrk439gpL!jtRG*s6vh=0SuO_lCydv}h4#x+WzSsm3?IunM(ed^J-E>g#1>XUHx;X^V@vgFf* zI;xPC5hm0V@tW?a2hs$Rq*Tz9p82#;?Zd~%5lUTOt5olH`ueoRSI$?jZs+^27DAt|;=S zxq>=^Lgd}~{!KD^R^L!cQfz;c(kH#;;KUWxR_6ve=#BPq)s-;fsyc^IXSC`JiG055 zQz$B-l~9VkeQ^}EMr)Gfebn{h5~T$B7+P(ln(8|dcC6eIcS?{)(W1I4Q-P<{p7Iah zf8x79Cec|A_~27l>izmLoW2%R@-=WOl&|9+lxe^O3sh>dTdDW1DVSqMl&E1v)Fy?e)a&H%_`X(_8@zR zJ^%FB zU0@%vi|k|e3Hy{?VxO_g>~nkv{Ut{D75f@r$$rDWW#6&y*$?b0`;q;`erCV0U)eS0 z=SPQu%m&TrTix00CfD+Ad=SszS$qbsLDGGs-#af0h+d&4Vpcg10i!m zezRNbA@(qQn-OL2V()E_w^!QN*k23PhMGeIL&HMbhDL^FhE5D!5xOh%v(T@@q%d7r zEZw{bJnU>WXI#g-^EjT#v-wQ)e}dOa&C&m1 z^namV|8qjF+0FLmcDvGljJ?-g`_Bj+7rG>LTj<5m%ijK*p#K)P`p@?E&u`wm`6s>@ z{{vXu`bXcP)4zX1H~zg3aR0w^Z#1}Zy!NLrJYPJaKD+$v<@KMBx%|xK$3MU4^3}_& zEVym-jI}tj-J2yZa%1 zbD(<7E4bTL}GI1l?NEc-k9IRoA3Z`=1sYU2l8gTId8#(crb6ttvrO=xSfacFy4x{=52Ue z-j28D9oV-#f=BWw9?iQ#E4uR@;7>2!oA=>;c|YDCR@9FV-~)LqG$xM6^8}vA2lF93 ziQmhI@?<`YbeN|@n=<(bK9Y~(qxl#u5&Zlt|e z!VV&}17-urudG%9(#9ZRD!h&KWxy+dX8>!w@Eg*#Uf6(iofphVU-iNYr0cyv?NK=b z=o#cxg)K-od4WzZc+CqtkZ$(E??`b5lL9M|zTt%*kWzhurvYzzfpFRCg#e`6ywC*c zTV7a=bh{S_7aAwQ^8o6bfKFE0>4l$>zT<_)NOyUG`rPe>y+~;c1SSC86Ep(AJ}Gby z(*0hb{ttM8^4|5r$4H4c1RntodEo%k_WEGUYLdSLoZm6 zUho3R5si)D8vx-%#5xsa+<;E*Nh0)X@cvL=130?Co|i3%i-(x)nrtZ4#N;E*3pTNOBDOtV1+vXPoS zDsafH=70)hXG7)y<^oU9F$8#o{Dy1L&Ta-Y1rF~ag+3F&YcV^f!U9`vdBBizf9J~sBMg{&hQfe2#cOqS(0^fyn8vuFyAW~`zz~4nm&j1`e3cUz` ztZ>Lz=p_|MzC%A#f#f~(GT=*;flh>e1^61*`*F08qyqWvFr5nI1H&4tKz=){i3;S; z!va)bO_5qu;4dI;p#tI)78axe`P(qa1p&nuVbDDS^7&yyR3P6QHdzIVO~SGPPLz3- zu{N-S1mxe^z#tyk zFarV|`XhX9icr~(U=s&sA>hT4a0q6{V~SXa@N_nRj4$R-@#pzVd=rAlT?iUa@elat z{2TrQzs9d)0;!c6OHDD243j!Youmj%N(NwBk}Rc56Q!wAv2>sGptMk0A+3@&NpDEo zrQOoI(h2FT^pW(n^ovw0-PC9_2F*PhtH!R0&~(-G(Zp(!H5r;o8mDHOrb6?OX1->T zW`$;zW~1h9Oizz$PH8^WT+)1{`Bw9bMrdR|$*+N5W4}PZmVRM=?foMBy7=|<8{n7d zm*F?o&*7KrSLipxZ?@kfevAE{@_W&5jo)U!U494r4*MPRJLC6>-#32O{I2`m)atbN zXsy~-+K$?2ZEtO?c8GSkcC>bqHb+~iE!EzqeMtM5cB%GR?aSH?+O67M+C$po+H=}Z zwO6#iXgxYfXVjT>R$V(?XI)R-AYHO9LpNTRrJJfN(aq95sGF}_s(ViNl5V~34c*(i zy}I{w$8=|OAL%aZzR~@p`$Jc&*XkSU&H5mHsJ@*(Qr}hIM_;CY7)RJdMGfkuCSBAd z24CLdTUva^OyBU)MJ^qTgQF7YI=?6fXCRc$RLgcNDJv{g4(!Os$JO|ny8z#@XP0G_ z(&H|%y^8a3Toaw?pnTvyLur9N63%xN;4GRPl!}Ro>R#ZQg(D%H31x1V(rj$J10TWT zK#ABXZXC)I>%DR1;=B534keGuMaRX*IkIqmje3*dPz%H+D4AKxZ(O#k)RBermrCQZ z^4&OCC8q!%R^Q5W;6wm4kd@^?Z}G}+w)fiYa+GG()k#p1z*#PYST=qfr3nfu3Ab8H zP!YgkN5IOLEB(>BZ8zVq)5#xE6R1a z%L)q|Wu*y4xvu*6scK1;A~7zdf~%y!fiM1V31NJ6dc7{($^*B8k-J`gYF({#rAUeT zTSuJ?B_pFQqoiK-bfv+JdN~SC-MeID;ZP?WdZn-@dQhfPE)&czx$Qx0DY8b?8%_5Z z93ulc!6_9)i&CZD2xWjHlm{c|7_~Abql_*`)RU3;E@kzpq>`s=nOb5LOhUP{LjA29 z%_wDf70U0Zy6iDZxluT+3a2&Xm&{bF`EEzl?`Eu0cb4)?2VRsYV~*=J_LeY@scUy; z-6a+4GAOPvzeu$kIEby=tXp-am%;Rr^5Tq!>=JywUzDv>h>k%L6V)Tpk&~Yv)w5UE zXeB$QJ7q^lb;F4iP%NA-q1;E4A&rUd)|C>ZYNk>)CYo$*V)r=J*2YGuCA*YXxFWNQ zTy&&ZOt-i=oLlE~-pYuM=|0QpRtvxaD)~7$Oi8`K;bzK3N&XBa#Q`;HhEk`ftPo=< zcNQtns2j?0(m8!~)s;f1PN~{;T{XI*PAOHIrVEGL?ZP2FXhdy^@|2PE>Zu@Bci%%P zS_Yes8riOjBDI)GxL!nznCOIV-a^?p$OOgc19IiTAeE4ce~O77q|h^ZkV?-%Y7>Kc zswI0UNqnr@pjt9MPJO0k#>cBg2B}4&m9D1XfFbo>;c#?(f_kTRoDfwOod_?cR!qcA z*O(qrQOb#hb*F8NZ=W?@IYjXPcvzx(3?h4sf-N)lCMpplZeYeEr9IMR=_`#N*0CcsLp3Ry37QhkNzIpFm0Wy1u%Bx-k?)v`vM16)nTVJGi>u2g8&_AnRuYXOyMPH>qsXwFtR)5XE zfqx7CQ2!485&m8MhxiZoAL~Ea-|1iCKihw<|Kt8I_^c*!uB%v8JiWZ4c>3z{ zwKk(D_&^L7u_88B43`V!f>?RD94p6uAP*M>D-CkD4AD-63)>;lRdf^G4$1B0aM_k2 zca^)@OrqJBKa0Mif0wIrGr3upc5+|2|Cb#_vz3PM(HDeSwAgp{`|tPlm(6n1k^Li4 zzD>tXgAxW8PM;F8DpkAo&Fc00g5Nt>*4j2%zi!OL<&%Ru#*CH?HlyXZ_(|8wYTnnz zD(lY-zjpB5HCx^aky|}(iFNEe`N84Mr+2(tQTCdxz1~?cX3DT&)1qaImMsZdI&aA% z^B$c)@8J-6k{qIac;2IP7d*V+;l*?3HEbg$$yV*WWsB!82{!J2(cpP}=_>s9Qj4W! zODmREh>o?7H{bE1;d+{OkgjcQX=U2HRr6NPTiHTx>8a3;(#avU6?4lUDV1#vY*{a<$C1ZVJaHqsk{koma{bZ`G%6+_eSkSmh z(=$eneQirY$k@q75&Zi%VxaAUJZYG)IP{@I2e*+UhEBG=2l{sXWZRU98$%)tMvG{4 z=Gd`KwqdVmM^2lN+avgnGPYh;i?DoCBkmE+>_@`4*m`d2xA}vhBYU=fTJz4-oEJil zzob1jW6-YF!E)e$*cjRW&yhdo*gh@za6-4B9_bUK`lN0@>Iz9J(GGa^izHzPHbz)Y zmOoA$ynLjO5}+FP}w-#+F%9c=WR3o{s(TWiRx*GX{MXV6R^+La?e`az{k}TPbo?a*A-^6pmeL{ANhs38R zYg_3|meV@1;`#{fKplkb=FCxZSI&E3?h7qsi@2$c*NN2HhqWecTdVPy?q^ZGf>qq~Z#W>Dj-aEOU z)x38}mce{ua$o!`>17a27F2sKRr7DpeYsQEc6@nGm1*lLLyWzxxf`c%4>3km9(9$AmyU|&M~&-VT(x%HjMc@{ zE6R(fud0C7uM}FX=yg!e(dEhRw`OZsJ-=b~JHhX*n=)q9R7Y}l_Nq1IwrNweunxjw z5r(b5T*x={*d8JDwl%eW7N<2%SL?o!r`_f0Zy9IxjIZsl76R+8S?pG$rRu=`s;ZHD zh7B7zcG$23qpEEC{R*eAedCR_FK^iNN@;Fx$@FP9(Ebgb=r{a~++@UrvI)~dj7ioJ zs5`=7^vpd`+fL_c=lNK>ueK=3W6{@!*M6!sRaSexuQoywoYq90QE1+M{p_iISuzVT zI(KO?dzh0G+$X(C_|3M7Uvvv!TJZeSL84pF&*g@Lhq;D3LJpN=ZWt7tm9D1MsC!)V)^0e39-Sft4TX$_L7&*2ecbv`io~9j}*5TZ^~%vl+EdJoeav$ATYv zcL}2H;#=TT9`2mM){1+*v0UA8?DiD zzg1@%E9V~+ZJ#h0MH>+*h?(1=V&~r6_u8sC4?i1X)OcnE%9$RcXewH2d+X#Rd6d@E zQJ;{ny%Ap{9?)ODB6`Xfv_|=Jr{VV+jqy-I?XntiQg8IQujgrvMeZ`!jE5FH^)MP* z8hBABFZN6k8R8-B0G+%+{zWT(Nq`L!EA&Dq!XT%Uv`dyPTD&Ca$$3lW8WpDzB8tU9 zi|}7s_3o#^`!5#AHe2mO@?6D*5W0`m7-y~8Fz3x+)0G9ErX(6Ji>QEY*Zs^hjB>}y zDo^LC5!NFo#MBcSW>fT(B^B`IF0* zEqZ*>V~gNWn=BFf-J)-haR4?u)22CQ-WOu@EK4w2qBE`l+h+UEeRq6&R{m<6yi7mZ zHMVGUu*q_z>iEUW8Hf57xE{W*%w`;FIB2v?uo@@TT+h)bm@!HZCmcO?6*%pgtKRtEntRLjpnwvxb-zx$%LTjviUp(^uGxQU1 z__#yyl!I@tnqZaIi?z^Qq=3@s!2$>5~ec^SlHmG*#crC6mkR$sSP7_X-#7{#NNM^lcALDl6) zMPRkD#QJ-U@s$N9JjYKMH|ut+H69cf5AwZ7MW3S@G14erDK!}PieY=dI>^N;WW^cH z*cJ#la@_dc+3$>j>#XLTGV$7zSuI)~=fbbXsNJuF&E6^7aACBpv0CIz@utYsi3S^u z(+wtm@SNBQVvR7!Cw0bhaiUtRs5T122g1NbA_RxiGB#EypI}(hV+WL7t@oAvDJ*|t z6%&j8SYv&jc1LNk{}smPb1eMP#_D>kVe0VO5o^$c_O%9CX@wOFqHl6q3f-%05MoUi zOP*DnHa)QBd6Lr(-DytybLX)`$JvLR_SZh*w6lf<-_Nmy#__HVZS*=gUc{mIZAuue z!LL-$D2FYQosr~7Syp`j-_#0O<%yU^G{3WxL&60 z-A$$)V_G10GAxaAtXxlJ_}dk{v-@JbPXj$u(5OP*Nn z#p*AP>*uQ(f0^+$jAOy~CC1k>{wm|IGro@T^|UI_H){BsjK9J8R$7?n+h|Fizs0c7 zjx~6`Q^M*y-^chNS_0=EG5$W|2WW|%AECu{{vP9pv9hkg;r`e^!bUtlrJ+UTk7+rX zpXdBCS>%m^6V&lbJN0NiHT$Vp2YnCNliVAj!d`EJ?~`QVx@*F)5Ep zg$#erK`LNU36qMLRLmqdlggMho&MC2REj^M1R~-cJRJmVEmY`pEUw?gn<+#1b9@Wl zv$!U;!lJlKdKUA;T1_KmZdjpNi3RHy{Elg}G532_dr{X$H&~aX%=M<}w(CB@%x;l> zuYVK&ss7J4Xwo3R!Tk+3HaOPc3xmdxV$>M}jOE6MjH`|7jfairjo%ypXec%GZ`ib9 ze#7#Hvm0(})VNVdqliWW8l^Ov)#%YiyBZyCRMY5Jlfl%{lwry>xlNCozA#;DY;J68 z+^KP5~(M<}Qyw&7jlM?}90X+le z2W$#BY;IwGz`WSJ$9%#3M^nG10Zl`jCO3Vs=|`54mTb#(%WTUk%Vx`NOSR?4z;=PX z1Cs+M237`c3Oo>aF7W$iO`8pCHm}*0=7XDm*!+5nb}d%4xDpf-R2j4&=*6IqgRTT! z4R!`E4&EC4Vaqlx+qHbO<&Ku;t!=G^)*9+c~UA?-t+2-y{KCgfkXINQ^k>QtOqix3zx1^~bH{HVxY}Z_}pD;5H-LOl>o}&690bx7plgPn)VX=i6Ls^Ltxu z+oo+hwoPk0q3!)`A8qSt`>%FQ+I4If+iqIBjqUy0hqMoGKdAlv?H9IR+5YwR``Vvv z|3mxQ4u%fV9VT~}(&2E23mty!Xz19!W8aR$J1**Yvs05!)=phIjqJ3r)7za+b-EUA z4(}a4CcHTO?Ql;-NJL!3sEDG7M>N2Pa%^O7b*HOeo_9@RT4GpamlN!0eJ<553G+oJQLH%A|cJ`?>zOoNz^ znCO_qm{BnWF^|SP6SF0zs!Pi*;a%dojOvozWk#2|U2b-b>pHpX{atr-{k2=eZc*Km zx=ri0qT7}3_jHfzKE8Wp_ZPY!>S5^7yT_0o6MAgyak84JGggd?_+(&_o?pN zvTsP=$NPTL&)9EdzuEoX?cb!oxqrxj-2;vfI5ptI0apjq4s0~A&A{#hlLk&0SUK?V zfy)PO8n}Dl@qx9mjbq!z_KD4oEs9+ndoflFiXXIM(3LoCT-&&N2+jS{9MJd^NCVyncFiSrZpCVn;8JUDi+d+?sYH@`B`Wq0Ei0`Y#qyrVJ z0u<+K{zR;+voeLj6j3-i^H`rVIipZ)rb;mOTk z%Rf!lSt66D|X12eP(^yd$1P4e%n%lQvA znjZpd#3#Drd$ou4_m0tuFDdGk|IjCm(x&N8?AMxRBw9Z^D|VdKh!3tW4Kr-Hv9hC~ z&?=TkTHma_9By6YG>COI8c}e4X$M1(e@9q)SRb^CD9^bL2D#n8W4c(EuPzrItHqnu z!d8JW>)Vr>-_c`7k)jjb4-3CUV)021Ew#gC%D=+@^CxmjY4t1#at77*J1*6M3s*NS3&{`#$jXM-QE zwq#6MVfgw`ANd|RaMZvEo9P+r@u7wq&s>d1M}v_cxv|tT#JX6`)oaAtkyg2D?K#U3 zgOC;+oKWrw-YXIxwR)UYW@fHfQF*VmHnKL>a#UyD?dk2%PcVpMwZB<13`ZA;9&%*4 zXn4?*hT@Hn-d^~5wXi1{g;BR6-C7%cefit`>=DgbPnzY3r}q@y1cOO9ZZ#v=UJ-k7|?X8r}WzJ1o3jfqm>RD=AeC+&dvXdf5Lsx;fsu~>gV&eg4WWBr=_oBS{C zesk;DpbP1{2J{{`IsJi|wDgp%aq?jj*&%`?xF+d)$ zYnMDg#A?l}#X!-2%szR5JP^}H^G zpBBx;2+PyDjpCqI6voMgdh_MYwM#9J8{`?D1hHyCMZl?=n{3(~ye5=5hnb6yTu-x@ zw>2D(>8 zqEu|tCR3FQ)fT04n9hZ4 zQ+Wr`DY@EF{!;n%*44=(Ea0V#vq498Z^2?&fwEXO>tOoZy`O4fZZ_xRc)fY(oW6QlGiPXG?;zRm=jb1E zLOv}xKdwhmkBrG!IoqbLoSB2?tQmYJ?Z--glUQGAHSZr}HQ&rPgqZg$>m(uX`_UBI zX1?j0MdJxgq(e;GDys|2uZL6x>^iaHgvdCt_k{UvF|X3{@#WV~RoTq5FGOj-(8-NO zyKN_)IkNbj7D>AK?gz)0PQY~N-sYG0A9(kJpf840MRgvO*?Hu;$wvor|y%r)>+H5%eBcx#f^ULRkrc}Hc_(LN#GDk9~y=7dt^=*LHeN#q5Iyd=?b$j7Mi`s5$v zZgOdmJR?eORWv!o)bA$$o&?J>hlx=YTs(mO_Ia$9Q=JdKo&4pnLl>6(wz>2~`)ToG zS67#Q0P4crh_f zo+ytUEXK;?&+1H>);WgSW)IA^K0v~4rtvNCI5cvg-zlBPdi@e4(ey%+m7hN+E}z$k zQ!tDpc8RH2dK-`~GUTE1sEJr4Z!5>WC#Q;`SRW6XikWIVVO|HNvy0}h$&qp!+2V$_ z*=;8IB}^x4wq*%(faqCc-XeMi)?81Us575VDjQXv5NzI(C5(F0`~@dH7pu8v{5j2s zfu2bxYc0CxzdXP99RKsUXc{Dpy+4veWMhw{UgaTGF73$|cD(a_@YRFE2SoQC z*)`49cCf5TkmG_(vn!8_O~=II;{l#N=O%stH?$e*CmJcTywvqE*wc zzldgkcK%b=#}6-^l5cxS7}1GEwAku@P%lp$Ek|KzU|f(KaZxsih>-c!mgt1jUw?P< z)VDt!9UKuoG_jM-)M|D4^`=L-=m!tnFR(`Ugc!J9JR?Sl690E9*Q3JZd%3O^S%|pyrJw5&UkKKLZqj&e5J^Sw1eo14;^|zU? z$=Cg2hP?mdrK+>veODFNv%`?#F*ehz<>lhFL*k=qe*C032c1bkpA+|qFfmDt3lb57 zghB2k2exU8)pG6E?S=l_;a7HS4w)r4vdb;x;B0@P7n?2ZQ)<5Z`q-HtzOIRnju?`F zJsN0-2oR6WwuDnQBk5%qmYn7v^URUy2n~n$UIB|izmheAoF2MS9f6LjIb)u(8nJ8g-C$yEhX^)HxmXkt3f@qP11-xLaL$(u* z`a;$Hv%6)wX1%y+$$}@JSPBWgUz@Bme|X@5p4zH8j?Ke^Wqq71b!=Z9cj?gEukD8* zym4T{@=b*YgRh+X18oeJTZ)GAD0ws%{yWQVdAf*_1H=d$nwTj{E$O-2PhQ+{>cidJ zCnxn8KP16s8gAf6JX^>?=ajq(!>*bF>v26 z-~W*I{(u*4X3vQ=JNBOmx-#Y)xhL3v*dn(PkBYun#9Et@J|JT(qC)fUJLS(Ta=Lg~ zMC(MWHxgrq79`7hn`t9VVGRPr+RBdB<5-?MQ;l%5_MArTXpG^B8%->71J9XE!*DA_ z$T8NjuneElYB$~1h)>1L6Y@;#;e2zlHbQ55z(5O(X4rt*N=pZ;=^{#hc0wGYDE508 zk`;k-4f5wtTM^IF8gtjhSV;Q~dYD())3D)bYp%6kG`_|vhA%IFEyarQdq&roXIvi^ zcs(seFBjJ?nmc>m?76dB%zbv=vvZ%73q6aPr_zp9v2Lq=$?T=Gm(2Dz?-Ubj?-$cN z_b*-XG6Bg#ap713Ozy_gM+iQ0ofdxt#*;x@dblMcdtu2+eoD zj`)qD?d1ryy6bK$W*>LmZtYnS zH73nA>BN}aT?yJ*uBi`Y2b*Y(6}Vu5_4mMNt7!)K#e z_ZdtNTM=4{Z*l)^rKPoDU5WLeXPrju4&0{`4`bI8n`(V(Uz%I-Ncr6I7LTl+yZVt; za-8R-=Gf;HQ&IT3LnG1y+gV4KSa*0_8c$l_d7bR=_={oU6Kt8vt>u^HcH(8M&WjZJ z8+n3!L;HbFbP?}qO^Zsb%4}v`U=Qmv5GTwOY66E?<=Jvz_4UcsT<*_I6Ra$Wlc0@j~Blg*Po z_ltj9&g$e5;u>unWXRXFXLSgWW5n}XQ%^bJ0v5KP)I238SUgW&sC`mrdeE?1EYyf` zBMqhj)|FQA3|YJTJxv3>JJNgFSVtp#TWAfy)M?#0NYO!<-KH15#}0bmo4Bmb)&0SYx-nrgjo-vD-sC#@ICYpsTt1h>u8Ti3R4Pry3#cq(_ zSZ&padp(&04W>y}nj5dLF<%w4<$R0VYW~EtAVF`w+TQSxfqy;Ks`)x_vSD>1wkE#| z`1qUNFBr_fz_Qj_23pPE=GE2?hUU$)(!)=bhckp(c_=rzQDZTe4zrrysy#Ku&;~7F z0yzb7;vbmyLVdpvtiXh87Gj>s`$kt2g=W(K<~`TrVG6$03BLhn+9!?5o9qhNQ=rEUD>RWZOjrFCMmhMwL@xG~W?p*3H< zHKomTtT0?TNK@M8BL~3;j;%yXDh)4))s>d&t!v-hY?GJhYc^@kJFoWvF)vKeugiCA z96}rHb_BHjFLe}wwnf#J$T4R{bD=wMN-{UvE=7aamnb~5_$_JmXTp2Awn!^ZmlONZbIy(rFVH(j% z9@zye0=!22NxE-%*&y1SML7I9l=rZ{-y-M1?}HBM#XVWCBrXX#y=>d7q54(nyV`2z;Z5kX`0LkcHN2zfMpvF@D>6YjN*)|12W9Bx2HRYx9}Y>JmsKL)gZpr2Wde~hKdcA zMOJh1a|ZL4Q|FQ|1;a@T{dZhUco7=;#2^ExYPX68H{P(cGVEDB-{3jAp9|Mvp*gHM z5_nE`R3vG|THP@@Nqa^omtAkBeQV{0x84a-cF#wR9X8?B>@71x_H4Hly4P*qyk-sd z&)xa?CB@ThvY|HZ0qaJWbw`!whpK>@bK;2;Kxv=2I?B3shme*YKeF*?i#uN-=|-=a zI3{kiRlT8oFK^@_IUrb`*aeFP8FJitd7v2nfNfM#x&iah9BasgLd*`QS%+JXXB)&s zT8@$*#(GqY^_u|(p{bsI48C{CR`KGSPeKx}c;c>ain5wN=x#M%aT(0tiGDXWS>Q$8 zhD+bU?|<>4^$Xax4PKJ;ys;ae^*tznFIu-j%%7_Fu(cuCAO_Q_mw9&ejpEi; z+-@I<8?jcs^VmJ-LUI4wjb5#-1FV<6TWMYMqILRl%>MT?F(%HckluX%oYl40e6JMk znbQVEFFtHIa(w1i@zC*{H&J@mYVj}6PeA>x1HgUPY9N2#z_qnM`6}%mNR{^Q7mfC> zv~I%++u=FK&HD$6*F0w}=KXW(zwBT`KE3dO+5Vinyz^kL9QfM}y|3N8%y2bXc1n-{QqeC4!|ak z?C)L4l57bKScrgxB-05H0)&JX2)(z^d#|Z=VdGltLFRHs5c7&C6rwX1@5`sYl zPnSpNS!3seWTomY>EY(BAB-0C%DuT^y*2R$a`=*sa8+(m+v1mqI@h|F@U$uMr_p1s zl{E&U%4JW{glSeuJ9?~hhYb1yV^}lw#b?q%)zM-x>{X*rV03ey%TmD4r3rW57v%sG7?A)O2{45|lj~pF~ ze?{0{de)g!ZOC^e{wAy|p9Wio=Xua>2-{K7PpZW!ID{EX+POk1?47FUZeiGZYb<)! zF*d}NpP=KQW#Ie}I7di*ud^x81IFAeEzNNVmyz{PSgthQ#OefU4ql(3HQo)=!^^(j zAsY@9FVv)JcS{SQryePd_=Jrv5D&xl4{DAX(g@Q}pWb}foW%CJ(oJHV9*FdR>?56!d0oz4C88_{5mag2P~sV;uKTcPH)C zkxiev8?$?ZP?t@eJKEA>{4LBStA6>*dWUevcxymOnSflPMDl}xPK=NEs;4LUwyul@Lj^#@OzpS`!c9jx&7 zciDc?eD3(Rn_nFCTe89S(J{@wd4oCJt0He59y+Oz#^y6s2b&lU_Y&s?&2 z_A(4wquD~XQoPO9L&?S#nm)UD{>F{>FTVHQ(D%D{KR@&{yXS@?eWA!s-gtIH%}&bW zOgHvuiVi(1N!8KKF?okhes4(KdQGm%?rc<Qxq+Kk0tA078zyHP&x*<<>rXpO(J%166*lZCG12LuEsr#S3B!!_aScSY{9 zu*%=xW9Ba>Tzh+$-B^5WWMHcz%X>?5|}JhNPWlq=r8z~0Db zBd@ZWUG#FZhv0La|E7HiJ@id&1E{92WgLPQZeRAydD8-X z{a_#pWItbJm-D~nxJ=ijH@oQ5em32?eC+d0_92@!gTf{+8EQYo2BW;uO?9KBm@Vpx9BfCxKB`wpQl|L8> z#j(s41 zVLS87PvRjA@83ClC8UCYoA+*tOeIZ+(vSt1Sk_H>f%e0D8rJ=$Y}bDHH<&1ne@i2$ zcVlz46IyHJF5Ory?dW=_7|#uQQG&8*X^m0(rPi;*+UTW*tol`U@2Z${qbTd9x+suU z2bDhg8XAMfjlO|3ZIuCC8jQC;9N+sZ*?={yMs4NBa-%2hST$xS`269A_D07Gx-w5o z@%XEzH+x)p{=D$&gCDQ7X>-i}&ZL3un_HyeHQwy|)!oVVZ;$4G`@r(xlm2z<_8j=8 z-SZ?&)h=P)$Tg^v2Q;V!(4fBC4P(lf-q4`Fi>cIRd9n%0ngl3tq|0oW>2qDNCngA< zteWOaUGXgWJxvdtTtfOB3i1#kq*<(^rV#Jgdzub9$y2UYjM<$=-i$!Q5?H@Mm#S)Pf_kt}48*;BqFcVc%m9ktA_*rJi!4`OZm$ZY{3>&jIyw+ducShLG= zvul7l&p!I#ug#uy(H?W%)M?21pPuAj`sL?ylbY7+*+;d|YNu}}f)a6>I+gqe<4zy80lU9aL0FcsYJIkZO`eQTb4&{u$|SdTI|1Sf@SddIc@C4rMkIMbH?~BOiv54 zjnp|dY*L3SYYU!dmwsnIw8@GS3 z=8Wa$&V}#VVZT0SLWYl}<69G&HT!t%{iA0#Y}js>-PW6i&)jqN!kNuEJC8d;cG%z4 zEnYZw;Z&qipKZ-&SM$Xag)9P+U+7|ezFXJv=O1V48&4hD!S4C4HG|K<3)#LK#sioU z#p#Xn`df_~GW5m+v++L}|3~=^8r|E%CxTL6X~;YJ*7CTk(jHdLE9b_Kta`m0Om&lF z47O9MYudki$KE}DduGj?@9XQcZQcQUaPdPEtNruenAzS<+j#JxhONeY^eNP^tSK8D z#73DnbziKD2k{R|l;45wP*&Y)&uXKVpGtM048_`6LqdLzS)@A9l^QqhEB?vEd~|cL zjOM_)SFT3(fj&a=E)b>VX#eG`yXhu7Tf0_ z%kt&xZC7-wmiVulW*IR84cxk2|F5BfC{CTCKgot*>T)taF28L0;wSZ!)TZzEUnX0; znX!KUiY=aTTnnE;z3hjz2a|ViJ8m)h@rjKwTkhe8sm?e|b+VPI&gq2wqACGgCwaMs zbVw`5L6p8wVq(ptq3N4eY)RizD}CXLh3Sjgo5e$GdT!C5kh&TD+2|Udqr9nl z_78cb=}RpZw^m{$C0)}2w=noaxLp)(7Y~+ZJxQU~>zzh{9k@}TC;J{MVevU+jNZ8V zkj3M>%g_?+QVoF1HRAQ}>+kl{lggBp6s5J-v!|H7)Pt`wd10+co-@9X-ry6L$B^V+ z%+oVZOk3*d7wEsB2~Ody;}q!RE#niZFAw%Df<2k1?^tpi^A~nH?CL0|fiH9(n1tOe zG%k_m)sTb&`6O)E+g+2}LI1h6Kz``Z8uw@UPs*5Jk$pSM1JPN#eTroyzeC5<*X*&& zy2B>u|0Y@aR*MrKI2P}*7w^z5@tF}i!Q#pGVWFY>Ro3Y$w>pI0XGfUnUf%KR2kdd#({0zLy?^*^i(IQU->-46 z39GeE-_*5V$O~Pn@rjw?aX6V_d8Z$6%4wb%Q)kRn}(<(g2Ln?zBYmg6|DJj9!3Fzm zSg|0yQ2CL)^rTSqLyp-vX|4X`-yX7R*IBhkBHQy=&Ayc4OglGi+`e`37JT`4;R62+ zOLo}h5P7(BVV#A@M-TwU@{2biz+y6%-vMLpu#-jllj03&k(zA_GkvCI6WB``7wHry z$S*Z4l3h2kuJUy(vEyRbx$c8&0gR*t=<1Xc-kesVFI54vBl15 zFT`3>6tuA}(MMw`uh+$YUSz{ziz?hvOPVm#lY+B3d+bB^YbN=Qo!i&aVAS7!2(YtG z+AS9~@V(w^SqU2wHgCdymjv#+R{L~a&I9IQxp*pQ-d;N-{gqXXxZQOR`uc%|CUaSjBTrXu|Z$WJXg*mx=M(zELx)$9^rV zy(yxhMy_^~Rnskh%4~~apt+%4fykP$2w6G7ffLL7nl0*D!8CSkcwH~7A@4b9u zf^{m)hA4$uB`+perbI5pI=g7OemiZSt}`!VS{1B#Jc(vFhsw>7{Yb;Pk*4Po)iiN8|(h z`5$Tw*J~k3hq0Gx_5n?NNtAvZp^xEQ_ykMf6Y5c5uP5f|JsnoO{X9=}#GwbhD}COG z2Z!X%D*dEp9lAm9yjwa*IvMdJQpsSoRyx?7eCJucm_Mn)4zeyIt%ve8Q?$KWlS<3q zsnR;=YhAAYL>j7Q&>*#?C~|0ycojzBo#oJ0`kbRV_Yc~KYTubRa%7){dRLamHn)0i z`mTVL6o_BnVBbK%D*VoL`OMnghwKHtbI$a+~h_1;>XAkJ|F{N96YHr`b7e z)VjfzL8AiaPP6yPA3d_5w`Rd)$CzQ}A*)7joo?&Z>)i1CYZ|{pIU$!U1#YkRx&8c? zYoGu9$+eF4>-Oo~$nNQ&!AgIH53#Im(V?MMNnP>;)b*bAyDQ29#Tlj{8-D1;wv@E0 z4g!t>(KT^gwzp@H=@ zDuYd)h*`;-SJYBA)yRoGr~VEFxN~%mDH*JJMRD1F-n21;7wYAU()?xCHz<1Nvdu@x zW1}l)@{Qk0)d&;xV;^igbN>Syd#u9_zi%t-?;EY_J8#^?e!$}mY4cBZ`jvMf4Cr&*x%gIn>jph6(r8Kriw+QI@hSA0QThz)Io5(|Oc5v@>>17GWW!#zYXY5JH@%v*q4;AFb#Aj zce1&4bMf7#dSx9}*sH^Sz_(P*PE6|ovwb&HIZ0zIxYE0Ii~!pegCP&Vpey#E)1+-d{ed& zr8%rA8h=@jz4r0J&3pITjUf{;Av-OPIfIQZ_a8IE*#g%-m-()JF7I3aekBBakLY+d z$hZ|2vA(;)m$6ht!>mI|CukGjw-)AsBaVwxIO1g@W1}Qb03lP1i+RvR&WW>*BVFVR zi1tLrMTy1tdDMqLt<>K~b>?@~%TqZ6CGDk{d-Io{zD1wi)y-P`5-QDLBGdj($qh@X zu;a%pu|3MESKAO<+q>=S#UVs~Ke*KG$#3$c6f4MSV>lDbkj_ zFHq07FL^3sz$4z&y+HD*{4Z8;k1`t+b^{S;l&dy>uYP z5idPyJ@6a89{9L1BBCw}Zyk)YhJ9)*VRBKX3Ci7SAKm=k-b>qW%&Y+eNALgG)=O(F zX_ecJRkbCSY^G)ViPrmQf?EM`)&YfzF7z<9!HAOmCgWF*1y*Ib(LwkXvTykltBFPb zCtdYf(E4)>BmyCCZa)qsV<&mE>*5AaIq7Sb!zdUy9Ds`PXXPMSz zI515PXrP~HWo|DZ_T}FC$5~d1GV-N^9rD$WEV%$g9L*2NLz#^MYQt$}FoilQdkFyYkkRh)i z``j_wWP7ztor_J2Ikag}-d)I&bgbhL+5tIs z(Re=_tHoMem0SE%*TYBCwQv7?tP9eR&R1G|4m~b>^nvj)o6Bb*-(Z-0JWnrcO7={! zl1?4^@^MO#Cu|ZQNk3C2Dzc{dF=^E~Dn0t2KXpG=v*d{q5u*!6=PA7Z)hub{3W`x= z>h(K?w=w&-QwN+~lF7rvf4I}X8nycD;?I>ReApOh6(g>kEmS|Hu7H8`%kB1+){?=x z{tHG=ps|z(QkI^VTsiz>JLd&}*Gk5<)xXOp;w-cbcOjbqNf(5-OmHrsvja7-iXQBcZ}4?= zHoRn(2@B>Y9kgN|ZS{IkX!K9Q>>Yjw$qN=P5FN?JMT+Ot*Y%~UEdo-{Mc6ziN(FciJ_A{ovj*}7+8r7~a7y1aa^fnNS+tkvsbq0d?4 zU9uN2eiHZctp@rmeOZeDr4LZTGV@^}tF2fSu$@~*bK4&_7Zd%XgtQZ8`yA`}; zCbriXS*5MTGbzRaBzK)M>a<$wC&!vjr0rX?WuyC%1KA&4GZ%&S_;;K4zbxKVbFgmM zg1)a~Q}75UjU#>7TP$JML998+r?Yn-cVE9F^Wa%CyAF@jctdxyZpW+KGLu zfbYaEcAo;($#+-6t!y~wGaX7~%oZXcu5PowC>!MKVoq@}4}2YC&ml-L73>U8OlDPefUZ8~ld4HX*m znTdD3J|+GW^oMCfEVt2Wah6qA%(S`{%b@=dIcCYWC7-@{%#A_(&KiRRZV$3hAcK$~ z0Tv;P1(<{w105xqZpIUib_31065n}i=YL?s>zJwY{lg>OJ&~zr zTr%hn`ubg_vatU`ReWoLzI@lo3@XBKNV2r+q%mcBXh}#jYgquPDe+G)$ZE`E{oIa})bl&ZFQ~^*E2>_HV4}w{`uh zKT}258pSOT!kp8!v%Xfj$vkVp63Hje3kEWlYgshAJIj1{(#B}f1mVaU}`<=^T9{06Q z2kWU^KuP+Z#n8sh_>4bxC*C8+QfA3Eh;Z(r*X8CxMrkUQM==4!Jct_s-XQY$Sgr|6 zKzUJ_RS_fG?Mg*ojke0IO751~7a=M;P=G&fKq##$s%$DK9^0D@lMl$I-pnK)z`+fm zX{h@SKtS;cyTKLw;atNA4O|#J+cGBV;Bose*rE-^b|dBAOunhT zd+Yx9Nw3HyOi;!GF`}ZjBuai4;nB1~uhoh{6P4O_6$|LW0VohA; zUka+bg)0bEI>{iX97q%j5Tl<1seVtX?scHpP{yPXr<@KBSYHo2gg(S1jUf*(<{%6i zClv7MOgh%?A< zwWVuE&Yexu7mOe@|96?FnXcp(V!pv=R(9i=oC7)EZ?`SB$^|;(Hx2b;biL<~nMiUW z^hbRA81ZSI%k!Aehp?9AnPfiG^<;-CZRdj0B8cgYtbSH$7MG9)!hizCYbRRh%fbyN z6%>?YN-(bx`so>#OezjZ3p$>}8#M>l9U+{3#H)_SV6c4jL~~VMHOnz4fc0Mikk8%zVGb%y$*CNFm8@HvF=> zLC!B^F?7;F|w-)i@zZacAKTew46Ihwm_hGqCjtQbL?t zXN=S1y5hll%NOBYTqMV`f!;5?I+-wgzq6rFKxYXa`M{ImJ}pu!iO*Lr?ebHgddN&n8dSEex6(urzA( zkeZn*Hl%OMc9$FJTAo^%W7|^Hz;qyM@{m3Y-tW@S&YJ3&xNiF%o2T>x#+Mqo_h|7K z@-r8ZnT-~Kjm+`uTZ{Gbm-1GV@rmP2t5lcWH_@7~9j_?EPaHhQc*07{R1 zrI?Mz4x`*sp*?LRdjU%*F`u=RbgY>gm2G16zP|SCx_#7c&FlTzPHARo-SgmwzIHZG z+Mr|6%dzrUMebygd&wQKq7a8o7%g!E&tSVeSZa$CpmfJiUfue+<+H-s6A#+ucXgi6 z!?2AshuM`~tm8f&_p$MXqvAH!Umeb^sbh;v7wL^mz=qKm4(HK2qbB(7I2B+Ywn$_A z)iH4EnaQ7FZEp=nc`Wxx4qKMvg`K2QKSEnFP|seIPxZB)D47LBFM+3IjMekeDm|;t zQ)kQP0>5{~#AR=1;{A$CaUj);b2yNSc~1@Un>oO2l)XD&82+sdzVA}Jc2Iq+(r?JQ zm~$N4Vn+g3PAc}ro=HVQIjPQlvAarUb+EFzwgrP6^+ z#iNS{1km|cT`(G@E?l28=b8mi(h~UqP?(i$`w@ai`79mrUvxgrqd)G+bU5!9OoV9BGx={Fq!Oy4?I-lu8h_lxLNp|R(py1GuV4Kmcs!-gk zMsU`$b!*qGCgi|D$lblY16!JcR=Y9?Jj=oYZIWLN%5?S`WIAM3FmNN&RjYO`9^Dei zmr<_Q0SV#Yg_^8(w=QOJ|UOg$x*gc*BGjomxU$i z!_Wix)@$?tIT)L|hvj;);42sfHnQLv*tR_hySC%P)?(gl?P67k&r?o7&+3>%rvNp_ z>dv6B0eblyQhb>!KFU`=s*$ht*QX)DrJOdsazK;6u%Tg~xJMwkUqEkIC^$ zvtWwqIvPy-M@NInacs+4E8Fr)!Ppim8S4~KRyekWN>@}%DI2hsm5#!8_%JAdwa?*Y z{17|XwxE#5P{ z?3kblj|+=)m?P3+*F@T$j=^zzk6DwE#)e}wA(2tB5oX7#xRr4> zhGgSYQ{z*xkUeCf)m5ljHE=3gT8bSTnk$})hBMUS<7~2KTBZ~Z9}FD&sjKHYVB}nHrszx*|DwrS0i{4b)8y_iK{FBWLLu1&K&a zi%G{I*I@@8qV~f-pk|fairetwvC~vM`Lt3z3L=$a_EAcKI_TxoL=Wt=lOEXY z($bTlN-43RRETg00Z?5_iHI^$(kU1(ag3KZ#$vY&Qz6TPE!EDKp1^g9pkxkdF6@Hglp=en(PZx zbYyI7xV`agjnt~R#{fw!KOc$Ob>Wf@6{w{{u<9xvE1%Ty7GNdPYG{}{L;SX15m}FG zQl)EZ?3oyc9htJ&0DA~0kJNLlHefxfW43P!pFjVmn_SygJm{JT_9NT4lbQkjd^@x;%RN~G>_+Vg*8r~PU7tI{FWP=S8H{aYgIN0E6L6qr z9JaSi>S#J#?5E4v(b_uL8opg4`5rC~(k?xrk>U;)$7$D`AV%Vh;&08Erz!TEDg|rT zOwbg^O_k!bOK}r4Rr1w_`}ftCwJ4(S{(=YwH{#Ae9>TlH*AjR8!P2UW_5gq>E&U0P@YmlY0bWC3a_h|SZ%cjXcC zVbe9H@1vEky7B)?R$!OIkrvIDssvdZ4tV-X$|c=L6MiIuZZDa4T3IYevX894rtRX! z|6%84eG}(;b{PpVv5zd^Xq$thFb1&ac|Ye3U_-oEuWQ&vAhUQ^NC6=mu*!LI<)1m! z!PKI9AMDtYtIL%Ku*yw2lpE+|@dLt?z=jL}E{@2b{Zkri;venzw zgB4gga@IiS`D66D?3Jv|UN(GN_R5QEVs}NXT>re`Q?Hz?_*EBA#O*wmowhb~eR6ut z%G6!aD^~4FS+Vv^ct-Z&71z$D8~2XzI>yp;3UAv}IUE@X^ zOt&RsR*oe*Gci5gzI)rcRqHd>t*o_f<>pmu&6_60g&ncQrN^&~U+EqlnGha1>U`P~ zbBJH$@)(JUbQsUJvu2aIn`|Rt||zt zGc#9bhpk?NCvTkRmjYgAbijYTcKzDb*(vcU@oDxTM_5pdEj&IVVR@|k^7zOohht?} zklE-!jG(aa5VIpSDl^uGz;S6P*~Zw7QSQ9jBldn6lwmP?d*H;r4@~hJVzVN$++$WO z&qy*SCnuz)W@fBPk4=k8wT(C$o)MTGol+}0B`S?7J0mtTVO2tEQg(8s1~EEgRkzMU zd}Mr7lsP;xA|>3G5}h2G673$Bl!((elamrt67A_2&&}~^z-r#JdiUBLw&WGbD^{eq zr^KYCn=`YvuUKtEh}5(s9NB43OiD^jv~8TLiA+h0US-Kxxnji%`|6C<8EaR#uSiKr zOfx6O$0x;EqGDqbV&mOI0|LU9Sd1P*XJJ`H`pQWAN^J^G`?RcClbW{Lo|U#Hb##@XWI6XPv$ks*;j_Smq{m}QnoZDe#pN{l@wB|35WYIn41GBS~vn3QNs zOi4;fNzP19NlMRjPfbq10j-%aYaN(k2>AM9tRviRbi-Xl^0Jk-gqWyUOdG`* zre$Yt$l8?bw=6m_A=RF)#WbU;khUTrCe>~fI#(0o(i2vun>TFC%Ff7$2u~w~qLAiD z3|(Z7kByB(vEZW;BBK&g>?tWpS>~*W%rFY&)_G}kup=;Y#maDdR@CN%rRJEJ(70$@ zlrAD^d0Lch?V^l@sq@{p&C47Ei2iUn3kBHW+%wzw5@mYRcNVj_pxB4d+M zRwSiBj7nRRw0gC9Mcj(GxJW9sf9NE~+;OpMBP_Aev2phJwINH*MmG>vWNZ{w3Z3Qm zRN81tjZceAv7urUP`wFBmFlNPLw+;Ip&8>*b!fq+F{apr#AL{XvGx=+0mbbsB&CE$ zQ%!dkV&fB(px(lYKvOcPD**&nD?Tm;4o#O3pJYKmcj0i7iQd^$bn!6>NpbeXn55Xm zcpM0HdnFqq9%gUB68&w+CM!)WkqrjN^uFKl!}go)OFr>0Sa{8S=kkEni-s-qnL0jX z?_i71QvZ2j_T>vF$*Pc{?yt{oH@&S{ejSI-c(XuT1{-6N$8=*2_a=kXQ|#+=HO+FF zr{5=*ADP?fJ4fxSXJ}F!$q^3om{zh$?r!r8TP3BhVm(%UuvROtUwbe^SMK4?Jv?k1 z+mu%FNT_7EsxLHLO|Dd_Fu77?mRemZGGQAcKR>@0zTi6_Cz4(g?&C|IR(!>B7QTkL z8Q-3~CqBnlU>m5$sphLb#Lq1>3Zpg=!WZ-=t6XHx)nGvf0ypC?zrxZ?yByA?pJq}yVhOr zUempydlQ_P-`0JQ`!si7cYpT)oS2{LzS?~QPRu{ye#-q4&ddMS{h9keJ+vNGaZbM7 zqn<}Aj}9JPa8mwgkC`4m9&~1LyEl~Gp9bl% zX}X2RaHGtm{uQIUC3z-!srI)=|AO$8RfIoTLvXDike2libgV87tE?V2t6Q(pM_$-i zeh>Kro&4_k9<1iM4_2Q%U_&l{ZyluA1{uccHUv*O+z}g+-ohEha?i&tnX2%}_G3Hk z9d$is4wl=8+dgO0O|AQWisQy!J9F#l!HfQ*cG~55-H3U^eJ5Ky$5|l=(t+!SrZ|rN z-t`kVx7h#VO|PB4Xu_)4JrAtic=&+%#_*$E`V5~ue6j6ZkmkVJ-8(+8e7I@$teHWx z$JrN;)*61l_qpHKaxXT`ZaA=g_ntleyJyby_w)7L?svd$Xb6FG7TTwMv0Ds=+n6P_ zqA+$xZSa=dYL3-<7rR9VMh8a+)CxP_MsmZx4IBrStDFG0`A<)P+d?P6O?l-6ID_fb zo=uxJ*r)B(EO#soooAUpZ|xC-JdxQnsSz>B(U!>Q=&0!Ah~x;n;g1&BaMC_sVXLsT z_OlM>Vl%5IJvAjQAw3~ICM~s61B2I zUAvf_pQ1oQIBW@O4ZAe2M{%T1_U!K0w@vWw+_|=4b2MFc=S+Bt>HloE3A6T`JHGdW zlc#r2pEzQ+?|5vOw90iAn(L@PP}jiLx=owE^}vxG+YTPuHh;>@1q-I)u)nRx zao@1MgnpJ~xDLW$H%#)4(R%FWxYc6-ZTw2dfjBIky_tv49b^pCZybm-x|JXnp%kxgunwQqt@FgqtQxVAlCiqNeH!Mg8@pp?=qbygoXoRl?4Fv~ z@Yu*`b5v^d3Il5)8s2l6=;j;G7);;h=H32e)YWdj^THPg*tdLnIrrnW?m1}Ng^h8X zh1uNt!>&Krl5K!KAOlA@tdje4 zeRVAL6MS{$ZPuj&>me@(i7}5Itn#C0e#~9g$~X*L^F1(ao!t<=JSH(ZF&d|ohiM#1$)tiy$;?c(8+?`rE}mhT zbW&$9;k1!#GA_x7ZOL9bZ3L%Kj1RyW_yt;+D&=E2U$N<_HXO$c!U}OC*&lksLd>8W zvtViym<1^d2z>PbEfu22+4iVg18vT+8~4)w9Gi1@PBwPu82eY)pM$g70}S9_QPI(n z(aABX;9qwq|0wHZ_bK%|8+zzHr6;Cs+cxgmv2@#Xd&=Q$+gGj#O07A1&Z3DU%rmzy z+HNyodr*6;A!FJ6OkYd?NwdZ*vKy{UInQdGpK`^JbA0p-iy`s(R#xW;)3{%hHx6Ut z@eu(!sI4QMd|UWQxJOdPUi2(ilNVOe^ffB680rgW74=)$moJpqQB*d(dO5%hiX45mw8 z?YVQx{{Eh;qrS6T%iXyXV_0*&C#_g{u|%vZ8R+!aumBu}&zG^hSQ0HZ{m2Fx=*v1s z&IB(wWJ{WpvUueJcSBgZ)ljxI55|DBHP6te)eu<|FSm9#m~yq3*+oq=e2Zh?8mmFX z3H+{4`80ZagzRoNJozy9)|ZEeH8MaE-{C`pa+vPjX?nxH6SL?Xq?{e6cjj6QEqn&h ze!~xvcW*szF)TuT8wG>?svGLNnSsS)U$QpuJN^+3e2oVx8t7ecgCan=f0!%x9~$H^ zw)O)1?h%&YRAKAKlx7~n4 z)CGZmEBy?P%2x?ie1+H@e)z6CU>jjD;7DO2;AEVjk8|naL?IC0kQQ-Z{z||tbbdcR z*m(r-EI!&P;!OT)fS==g$s)exjI-PEh2avwQW2O%gIE>NDB1w)hz$W>7vBbKBlZC7 zEe-;FUmOcKK}5Rvemu_9hx|PsaFG}Vn1mzw)#3&mc&`?4ggf#JjF<(9V&4k?Rro5v zO}tehJWllI;i;^2>4m3i#O&U)|1iPRZ}OtKf;ZyhS6a&d8}O;pIzoHFqsy2c-a_wg zU50rJBf1R%oYt?)7;j<0fIqv*G;ls?P#%lW(D|elstL96*;ECmPVhn-HFiF^ zV^z;4Kl*qFoS9Jc1LJ%^n+ z?CCpw!CbLFhr>7=$Kf;%{Wx62VF-tj942zOlEdsdlNb1kTRGg#;Xw|Mad?`;Tn?{r zSis>e4!_{=?i}AazTyuYKH~5f4kZp>5>&ZysOPXMhc!5?%^})>xBdSH>Fj(JF#TWu z7eULEv;PGW1yeux@1O?MS{>BXT6mY&lPKUj2E3&0#eCek3-03g>VcIfy;lFVY|Bo| z6>DcDEo*l{i%unar{X#S{-Htt66+k}Z>>UiVW2P!pZc99%*7WyqQNuP2wU-C-&?{L z_zK8lp%`DNQ$Fh3L~Jc~6$hio`{RpsiAeMP(ig%4T%ypV6km=2d;#A#0N*TqR^d)9 zG%l5${z`~P2=O&)vq|Ymp;_rY;SKaWk%u6x1;AP$=*3N?+2ZEXo8p$zqvBRv+e$}> z+e-_?9iy3SU;?P7MqtPJboDbAyX&0*ZqQljqtc^*M^UqYL^a->c$-xP z59y3nn}ik%#0OFG!Ab83--zBKwNPJi99lS{^q`Ok{O{u$jcY9GSS{8ST8Z^>H56I_ zQwZ85vGjpZC{#hX2S{_0&{%vE*IVFVDtrp1y4Vsl=O*+m-6KxIH3iqS(mmjRH9?71 zTp^_w1V`x|;JF~A;{OX=Qt2I}G#n`nM@qxRK6vhj>wVPdXw=zQPAdbE2N9)k!T%j+ zd5+8PG(tVl2TCGb!2gS-CtW2%DXFwma7{yLsqC##_Eso6J{n?^P->y>!1|BSQXQ!+ z1WoCk(g&s4rC*ocEPYnG2Q=Qe^aXtG;Awm5LEOJ6y@%@p+KsL|Xt{f6wg34CTrZG= zJCqBgSMVxAq7I%v?u}NYr)SQ*P>%R}{_-yaDig5r3;o&oqvwD1E6)+n2i418&I9FN zNyC}?3!!?c?8?o*O5OF2(gc0uBKV*GN+{Hx)W zC(0RO@OI~S@^5RqV)=o&JogF$ie2W%^YAazD~m*Z;(z{?r~E&o`X3Pd=eaXoKGV`=3IOJe;jOw39D^ckz;Pnk|3( zM|Zs33T;=Q$G@5zq!)n_KH@d=0DVvCCwfRguD)AVKHd(_epI@uG!${Od0eU;a1pfE z1IQ`(QN5#ADYdEa24`O=O@glzqmws)dlQz5Wi0Ql<-SS?gnXd%cOJ{t7G)glH+YD0 z9#!;H(st#5=M^JSc`DqetiD&lz+2SUGs#r3vylTvDqnJAQ~=xfmX zozk=LtL~yMC4Olhr@VWpXOeVQaOxx;N$xCYw-v{;2jS4;IF@^*dANIqRHy~Fqa6x< zTRsK1D@XtOKl1iJ_Gh#cBmh?`wfO|@}<0*p2fLx2vH_^^{H0y@{QM5D3 zxpaSz3q&&yQ-d^rj2<|L3&!xXQsPlTvol11~2ZVQ@#KE^852&i>2)6~>AG z62o7L<|-dW!uVD}o<=)zZi=?ehU7+1^u9WtAA#Te$3K^RpirvPa<1OOQ{}yh_p%D9 zS43YiR~7yL;GTFS)nF~sIzcypDJ04zBhSzHT>*GUIqf`B_zQA&)5S}OlS02$1)=o{ z#|4f*{!v=IuU2^dYU{oFR3X@3y`?&*eDiV;?+2&H6UJc9vmW5>i;A2~!OuA<=#t*> zaAmv>JnIf`QQpQCX`o`xD$;btHuxhxQeLahv|r(o6|q*l$Lv{|&2vvG6#| z;m>{*^W_SIx+oiATz*I=5B?Z0aaZ=XVp>Y9S7tQjk^kadMZ7#k8q>b!HGU6sXPU!S zq4boTydsxYsgP9JJz{{vDsOnJQawSg<+w>2Ks`F&-ocx)(a7bC5WnNcE_`_Bl=CQb z1z!cbGamfW=YbnJafL%VJT0XpN=$wa39~$9!s&YV@6sv@_b2?NJf%M<56`J9t%~Wp z^7~uA-#znrE)V@DoalEk{tFMv`5#g3e}U@XMnMae(K-coa*MM5;jC|GYq_Xasl!)e zDoNoDm*9Du(w#DEQ^pD6G`|}Kf8S33Hq*`kzfHd)Zr%rem)3uZ`LBhewyK!+UyJ?M zLi17Zcl^(VgYym7Lxul;M)MVd{Qg!|nd?t$9jtW;vRq}9ku)=pz$L+f!K;3wX(1^W zVeqMG`k~$bG?#e&8>yW~Q2;&^T^d zhSAB%$~oL$$N*{!HBcs@Q@@}w^*@pWsfJ%oN~upkXI@@?TmDoUi+XZ$DWpd8o$S)- z)Kic??}g=Ie|z^zT$(H0EKPF8rS`5cr}%Bm-#;U#+e`6%@bVwZR8VmoDSv~!kv3&o zX>2*yL+Yd}rhG%5R>IP}mSg#SPDqX``~Ahf_`k#@8S=mQp%jn)jqLcRSUJ~wx10{p zs{bjU8w^^2mH^sU8e#q*7FwBR*<~}yS3*_iJ5Wj;G~{`RadX4APapGN%776wmFez7?N%>O9ZL*B_Tlr3<8bujOT( zfOgUFx}cW1BZ#_bIzRYTg3W;ni*R4yx+^>ozk;ptkK$w48~+L;2Cb@+%1c#KWmDBx zHBq%ty`y?p)m7D7H4y&8aE%eaQcY6LQ2D7Ar~(o1xhfR@AFBdYk*avaN>yd5vQ?W^ zJ8`#Pbp$>q#e1rAcz;QiueyPBD3zKV-webpcagwAF4O5KzRLw7KDj&aLFQGJfagb! zhj7(IJ{5=0y~EAmE)(xV%dR^V=atI~_-Z1(idTJJZYsM?^$o5jC`Ak8=eO7Q@Oy~5 zQLd+|7pSAn_=>%X|EK$bs#LYR+LQmUjy&yu<=U?rqdKWJtG($zZvnJ|x}mz6x|O;u z>h~N<5cr4J0@PxKi?^J!^{52}v2-jbMl2mgP=v(>TKp$|-A8dbN@;Fp0v!OxSzwBrLZqj*}4C6 z?$eEYM3KXH31W?ze5P<%i^H#Y$iDoo<0V-ZJ>>pPIIP3{?+|pWs-~58XP<(t4RphJ zhMiEwb|@XkV?^SO8huhHc);$d4eTD;!S<&EbR8XqPQrUaXGmXNg>JB9=ppnJdI`OS zK0;ripU__zfc51;u#s9UED-{*Rvsh-3rk@SwN*F-Tc~rehRTI4)aS5t_)_>v_!<^g z-wJny?}U58-(dT2U-&_I01GK56mbiwQWRe;YDAsr0V}D>VimC(?4(TMYho?Yf?Wu9 zv5r_zY#=s*#Z*)A4Y37QDQSe{mqJD29l`#1Y~saf~=l zoG4C$RmC)M2JEPOL_cvZEG!nlnrev{Co%_g&P-IANyXBP5FMVqLMm*id{| zoGeZir;GE&g$NUkOR4Msi<(|1tmn0TszPmF|NmIut^RV2|Lgh|1*Oj2F&0;Xo!uy5 zG%RJtq7KIk6JT{WS(qYBh2_k2VFqe-mM|MN>nr#Pb6}Y<5B7K=!ZIOL2ooHz#|wu& zUL;O(h!$dmSXd;)3kl!}NkX!aBBTmw!U`cBwl~?rMq#(GUpNeVz4P3%<0kC%UcgH4 zSD{#ViJej^(G3-d_!8XSxdOO>)F)Toui7myq#dpNEVtcf0XISiX7kh}k z#6Ds_aez1owtGXx;o?Yfv^Z8A4;wzE^=D)M%p7qZQGvKv3=o6FrQ$L%Ok6HTh*4s+ z7z?^^gPq$u!d_t??k$+dc!S33fyx>PErgcB`=G_4!f@=%IVv0zP76801>s^D1%3i6 z6NL(49|$@YVL$gKaSON_xX21{1N<%M=a7oHeWM$V)TBpZ*0%) z8@q$Pwg@A*ed9<_*+*z2vTq#A?Hk8)`^GuE_s-|`jf=Q_V<@+8j6{EJD5P@x#!PPC zxP{v{9^&?mC%Jv&MQ-1CncFvh%5?{;AT4XR0CXfaJ05~-wsZNa$^y)Bbh5O!cmB9)7Ag#V|RlpJZfd}-5GlDY?z+7}7oEJFc zAovW1s}3$1fII}kslhFSfH@e>0IsWqaB3WhQ;K%S4^Sj5?p8vr&E z8v(wKQCS$c7Pqk4uBoSj)3n$63~L9 zcLD4sb_47w_5|!L_C}uj!p_wIF5e$;pg0h4us9fSh&V*346Z*6aD+GlaFjSo@Wco( z25=ngwmdNsOaz=HPJ&I=6j&!!!Kg3|aF#ersEV<{2hdOS1Dq?)1@ssF0T+l102hgi z0GEhMglZT!0s(`?V89SD1Ta(#6^s~19Dw0sIBdHjF{03@s}ffz>)N2T2B53<@PqNw zAI|4Uu5tYoUF~aVPg;R^hjWD5u$QVMye+&1N~i@ZF)yS*RIL13qt&gzuEs@9`A_|* z{F(gRK<`@QL@3VPUt71zRE9pcKK23sPI;W|K!`m`OX!F{x`)% z{!KX-Z1PHOTq#xzMO3O>%^?L5tyC(z1dJ+LwAAmf7Tiw`)Y8jFaNR}N1r-zI%8llF(sWA?XMc&52X(2O=M_-u;r^aYD8L_9p zsk!u^hx{-TZ)d?(f*dg$`SgLS0(rt0{(f*q$Q5(Yqvpc7V@#O`AAdL#De zM#X5P7z6o22MHqq{)vz;43IEZq8DYuRfdeQ5&pa3szTP-k5mrBY4|9rhum=<_xW(u zxsARW63CAT`2tRaBtmk1F`Ov8gwqfaf``BXx`}RpT2Tw=F1ibDkW)|g@w5p)1qrWt%%iY);l(||9x72CqUz1SY` zT@jM~kDu zZO4jZ0U-;4BTp75gWFCOrvgsL&W0-DY;iWYr?2P>I7gfVI8U4hI3GJ6szF*>2%fuG zT#WkwF+lKwhRH{N^q22%6*ltDi!xjX0OA2~0IXhb<7HHG0C^=*!JP-^9yagHwKu(I1JI(JYsK z%70qhRetoW_)(9=xD4u1BPRl=&h@JV4quzQ`hai2xp8R5K8f1S%MMyKf(o^uBbxWR ze#A)?`~)jkaJ5kbii4#Kca}0AD{y&p=fXq(8zNQW)_P!3ehOyg-Zfg$>{t0!LhdU5 zTB0A*IHu(3b-b+#X9NAyrTmn(pl~GN(XS>P#ZfNuQGUwEq1?ODcD*bA-x7IMu1fqr zjS{b;oE0yq01<&Mq6ycfJXZ`y_X6rbz^F?$0Oc3?(M5jLI<0U=R^RkQd2_vY{U_Z3 z`I7`rcfU9_qn)s0Zhv9-N1|i+WKH z-bb9&gL6_3&PhEuCw1qX)I+Qx*1+4EVogA^Xa=k;)&_i2d=s3GWLuR;vaL#dOMDAH z#49~Guk_%&(u4C#56&w+xMZs4lBt?YrfM#ks<~w9#wAlXE}6P<4yfn6&%k+~f%85C z=Y0k)b!xfPspV3qj!T_7wBKu7mZ{8pv<}>hW>EFu+;}e&K|u}Bd)?|p^86}R+Ka?z+bI`BW|rY;&0@L=epb<^Rw50i?9(N zAX!eq%pZ^s<>%te0@|&d6Vp4Y2l^>_vXs50(ZV%il$V{PuJRwnb;VbFDJN7Wa;~(? z!@KVE$g6Ty<^M@9Wlkonz<+w8 zyt&@H{u38hxI2}*_A9w@rKpSpN+_aI<*JU+m1w1M*+o2`W*oo2%-l~6ny7eD4J)-w z)Lw<>tv0aHF1o(Bh*J}}Vu0iBl24(lEhHGmT&Z^k&lG zLA6|)AaXvc3lKS%)pCsh?W27kS_9Gos5q}xabBz9 zyjI0|t(x;%HRrWzKDT${yjI6&_->rz>i9h0jq_a{pY6MG?yEz8YzP|nKufrzKhZp! zT2hheX7ZMWJPub0{>pq?hbJ0Kwa&4W^hcF=o2vLIs^KlG=3}WFA4@fSEF~@7NTfw0 zY8Bq%Rk&ufGH>@P(2vdlh0?fMh0k#+^Er+(##VFE18M0+K9@1@xl9#K4^{ar#*mf+E%?X zGV_^^fzNdGe3Y)rX{;)zuBx1_s&cxj!s)6Cr>m-*t}xrde1~+jUYJMFe5Wd>sH&Wn zs&Xo-%IT*n^tJC`_R(4FjG0JRu`BLrM&k*+Z7w(RXG(^<@8gP&ucvS zyrwdr*LZS@Qf45|gsFKyQS%<6=6yrW^XkU)O8gjt7c_d^HL0)cH*bhk@x#7t;>XH< z^S2>c_9J}(-*rBa?>e8xcby0GUFWHM*ZFq7>-;p|b$)~II{%UHI)CZJ=Gt}s4s^Kv zxt}}gLfL!X4E56$HA3kUk5=}ezX82SH}p8g*R>bDIW$h)QEQ5?Yft){$X^fiNX6H+ zH@yXPU_Bv8DZZ{f>Mfy{>jl|L@pbK0Zw1cY8)Nya7WB`3uuoX=b?semjn%il zkjF+$p6s_srRC6*!x|jgIBdvaa}M9(uoH(pIULC0h-q`@%~4I@a2kg`9Qt#(gu@UH z!#RxQFqy-Z9IlzMVDePeMh!QT z+rq{E3*Gb_R^_k;hqXDZ%VA>4^i|8MO`M-zMm#RS0 zqp|P*{~gVPDZl>&w*~R>s7~{P$&ygn)pTX}; zj3|VVxi{zT&Yld*o!OaXrKdDR-hr6eV;~D=JApia-2QM~Aa%F@hg^cRei7l1Jx{%! zSSPcb$%Oj^n1=l}tB!dpbeu}$AvucsR4)IM+U#!VsH>j(8t6qsjnMQ(jJB8dsc9VH zA**=93q0Qy+FsR$Pp5!bZHL;}rdSwrrUPdQ=abDrJ6 lhFuHG@z62GMiVSkV38@7m_`4yV4Y#t;P(do-MhJ}{Wlv+JeL3f diff --git a/docs/_static/fonts/overpass-mono-bold.otf b/docs/_static/fonts/overpass-mono-bold.otf deleted file mode 100644 index f8291d926d984f94367ac8d9edfdf2b4c728432f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95240 zcmdqKcYGAp`UgC-HQ7lvby0}PPDCOqCD~*XiiK1Nh6Ix!MMO8rCRs?bVRw@dL_|=; zh9DM-g5BL#8HN&!2d-nwD*C&wU(iBxFx&> zSeiVI-kF~cO%sGTT;}C9`-7pAHw(i-?;JG9f-q7reu|pNQF_TIE!V|d`kP=heuEa_ z-MW5tdim#@f6X@SGo_)gQ7}-eAQfLxF)n5s(dB z22g)}EcGRf0+NAq0Gfk%pi+l^U5mEzu=dmM>-|U;eF5T&=8Og|0O&roy#!nV>;!aL zn@}GKkjyH9T;NKe4Imn+EdbmHP#=gb3ZQ##AO;}$kY1?$9)RRd zWd%Sq5_I~BFP&DR>1?36iN0_UeZ>290M&Kch`w-8dpL-8((QPF=%Mk;0n#DqCRT$9 zCF$=0fb1m#AlZ=a$i_&{w*n#HTp%8xb!jcKE$VwCaH$6B6VAJYYZ^nkFav&|88{5+ zHgg&3B*#kx;ja%-rUGQkkD1;S+6br9I8QxCwkv&pLb5MDeRuX+Q53Ngb9uDYopmLISU89x6KeZEotc09v0cyVw7y^*q z%e8Bon{?m>NLQr*wNW|Yv}>J?@DhBVd>j4J0bMp^N5sSFCD{YnA+^&SnOaGHN7pWZ ze1d#ZFG()b!rEw#WdP}s{FBNefX31_*#XhDs#1FG& zt)%h#dQ`p+EC#LxNKZ!q@}rwz`*#9&p?(7}7_b4PFS56D0kXrizrjTqdmHYN4Xy?# zC#(m^kM0LHY1f;zHfsN0`&FZFFQB(p>enfB4Vxjmpf|H|8w=u18yKDHg#lK~�mw&4 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 z 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 diff --git a/docs/_static/fonts/overpass-mono-bold.woff2 b/docs/_static/fonts/overpass-mono-bold.woff2 deleted file mode 100644 index 280570a46adcfdb48ea30406090fb0e3a4673509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20532 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 H`Gw0BF8zcF diff --git a/docs/_static/fonts/overpass-mono-regular.otf b/docs/_static/fonts/overpass-mono-regular.otf deleted file mode 100644 index 80a4b839b76cf53992e7fdf51428d0194b48bf46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94520 zcmdqKd3+Pq8aI9>X_7Y6rfX2BZKom#3fQI%w4gv&C`$`%Srin~Hf;lKQXx*pRX@xs%Fz9A;8g4;;solwIbUbZzr@jK!>Aj7_er_cVU|!jcymE30KJ zA-C4+sj}a?Vmz+B2lTDQ3ERz1?3+h`#n9`lyBHX)qbo|{n?StNJTztlU;#+> z3xRI|!)9_(Cpivg?9VSyUIIKr2z#5&BcM*a8FohfiB_6}r?-|Di9qmhxsrJ-oXh(7)8c8<9``OBToF|(x zWJ5MfV`b~*WhjlUyO5| z0iz@x8pq@-G!M6By`=s`pHY&{KL(I*S%B|=pMk}&{kwprsNV{Z4D0~;9m#^mrg<(s z2YOO}Tw}naz)@f;unD*icnWw1cp9Md+kyYK9oYf-1I0!vjbpNrOJFn8^mCV^G(hzC z2hxBPfOJNEdjr&OkY3W5bWCGXok{~FACdvlxdu2FA3JdENdP=b4)Mc9nS}dCXzeVZwAQj)&q3_(M;F;KoFP*v;bsVq*uB|bG7eF z^BVnW4rP|B;PE6WPYU%vJ;XOfvyoq{?vwacLgv7=%a)5 zR@4q%P$v`vWLFfMGuxpb>Jh*|fP96ZKtFVjV$lxZLV&Ila)AE8ZGZ%ux&!5)u(u@( z>d{nhhg{SNH0KC_=pw&sPaoBZ2lAcI&vLDO+hMpqv|StOX9Y-4g!XNzem>wl%lR|g z{U05J&#eIY=>q`G|9{k9Z*S0hwvuE_V-kN<8pl-T>Bl4s(t`nNHvkw8^ab1i^(USD zCy!BhNUF z5Xa=B+)t@3VDvZ24%d(UhwJ(nd|s-brM)rk|1BluDWZkTK&O}TB|oOT3ACs6^!csl zIKQpq`SyL!Ri`{|T;ufG}mCjxCVRUK2Es;{?6r9ggVVn>yv6A z6(Bmu2dQr^kOVXX)UFFK5JT@j+i!pwueY*LBKR=i3VQ*tUZVh{h@7&SU_z%1JFjGKU!Yq)~%_h2YFkF<vNxyEIc_(o(uAoiaU(LJ>Wr1*hlDqKni5 zpHVDJubY^S73g&{OJO7QdKh!Ese0YQ5^)zr^tD1h59oCp>%q3_^>8M$5A}KkOJ*nZ zy4{?Dj-s#3oM9n7&tbctR!vw@wm^m-V(q*JqAx3IpQjJ{UZqtgfac^ezm=})~L&N`h}tk)yh<>yuD zb-Q)oc}8EEU6OP}KOf0@C5P+vsMP++nR?y9ULVw;*W=mx!C86!#u))$O>Ic&QQ1>* zrKR^(DrP99-YR9NC)7(RYN+g^z9plybGq_ea3nNL7%@tIZI!o{aMHG1r?7H3V5o#^`5{~ z#b4c#=6r8mvsWqfH-v(sI?flW4fq;rLjHzcO1=jdb3MK~?+jxSg$8U;{EglQCFpMo zRC<*bZ$&i*P^vxkzPcHTuOZmz3qUZC&rnFL#WO=0;t$pOAfd8Ge?!o(U(|(%;i{C% zfY%ceecF-K$8K*wZ>ZL*gl05)t38;tDJYujqx4Y<170s5s~v5arX23@`iU!5;BgN|n? z-sz3rN|+U7Q}3_x1{%oH$N>B`0Z(J?j6U{qf0bv(`$5Gk$nyogN<{$dgABMLAGyjG z41u^%TR%t?Bf~+-pMrhhx_tVezdF?72@vVt22U^LwDKVa2;1LK1HF3cpe-mmTi6^1w|o=S?PFd}lZ zIz-AQvM}<}(;g+H37Rl^Gxr9ixJm}-E})cP8QW)RPCh$uP=&&`g*SoCJIoO%#ZUU@~}^3{0O&%!OkJyTKoVFW2z^kCXL5GH*B%5y2Uagk6ag0&*%~!F5Ck;-R;yifSFH09}{C{rPOd7BSpuPu0Z>ccdst zGZ|@Dp)X=!%{sM4t~isBb~JMlv|R^{wf+{EPk<9kEQ8+D$wYV_&B#^2vl3aDE_5+& zz&ou8iI7_#1+mkLz&YfM)9%~OEvx*XnkMr!HbVMP8ke8HvWbskWXYx=i59Zg#}wJa z7icGGvI_2z_=c>gxTw6Sq`1ufPGS34@-FzPrVxy2Xsn=@dr39YJuP7LyooGM7uzD$ zP^jJ;=n?FBHU`L$D$z3l>S@72wuSiFR9QP0suE$Y7&>mx1BpuLJ&44i8@8BS@l^Bd21XF}^o3jy*^FxkywK<+d@X=% zr$?*yW0MFdd>~d(Jb%0fKxr$iYj$9+Up20lyF+-`W z^)z64R0A^$)O#rY1?V&dNlpTU(oqa#uu6ls1sS>7hnz`POKj#eg=+nQ_5u~m(c*_( z%uCaFsRo}$cCW9eddOQ@OUsu!r6u4a{b73HZ;dcpsG+6S56NS7qz5hCkUP+X>A4?_ zDkvRUR8|H*P`WF5CB^x=PmJ;g>V14IKuHnt)C&$l0+tjAM?7v*>Oe%Mb)4>z`uzTi z5FD9A;o){=q^b@C@J@(8BJR#WJb?uw_Imk%Jo4$07-!puKaoZdUF$jq>ZXR%ahvDx z(;4!NX<-nQ+YI-vhWYwih**fM3QIq%e)`+(={=QVFVeielISo7LQ#N6AV|Om_508d z39ShlX|o`T_R4ABL5DMK8nM*KYkJneSl+s7XvWp^?|YtApvGvYvqyWO@mzN9oWTu@ za$5^te`~=<=kdb)H)%=*GMMHB5_a0nV{jpWcWp=?ih64q?d(Uux%oy5|{`RQdzR=?JYn z=H;D^-69F;IRz~c0`$n-K&uvHPukh&@c?2(E`mTP`%#9V7)?6>+BfjUyumbO&CH&B zB}46qY&|}nIW@l|7T+ScwQJkahp?D~2kR>cz7hdhP;R|HgqYxMsPYFOH*&NpEH^^5 ziJ{u(Gc<8n$1l%g_aRB6fBqWpq<<(-@|9KYL3 z8CO(3v}8=Vf)=GY#pPFGx1i({U#Sc)D$ehv6pY8VtE@~ZDOHL_jv7%^fOAE~c_YT; z7Zndta?!82gm!Zyi^?%*c?s{T4^>oveuWBX$s3B1b8?GD6qR4uODQZWFQzdIF=&o5 zDyOu(C~wS&oKj`fm{Ra7bdzaVD>283M{|Fx}gALGm& zer0{|GX30TjkuxJr?Iwi5SC>1lYCWIVB6;`H`0e(JR23dEY*)gx3O?(}OG2W+W(R0BH0Y)`U?! zXrGQz)A+vuEFbsiN3gMMz+ZYBeS4qL``oh#F52c9%c%>3d!j=5FXugT{QsT~ALrSF znL^;w19^J!{RweA73ch{8lUHub3R(vaS1A{kW(DOc?jdI9a&-}Z%5YHexCO7Xp>SO zX2-vC@k?}&Y(k)ncqWbnuT7w*{pcNOA=@wHR8Vh{8qsxjxseu#FOoc2zZjKje3SG$Qd)zne)JIXBVVh=Kfy&Mu8`#tZ4|YFpf`wPn$ei2 zp0}a1)R(TcmvDOxhj5+rPWq_g{r_qQG-EyfHK8TZKqDG4hb*rS)RR3^t417o+4R%L zMlb3iVzcxT(-iR1E+0AXp-bewnOw1*Q6ifi=r{vC7o}hO2neS*AR_R ziLsh=&5#Euut*<2rlSD<32ztUHS=>md>S*6yvgI+OIO5~j`}7#sV&*Kh+~G&R_pTe z!CEM;5r-6C#C58XG|8(gajwm7NW)}N0dPT7Q%s{?6ah$%M0q3Tn*ll6;e*r~yeOSH z9TXSaq(>4a3#s6}$Qp=N;S23)CLNGX3CR&Pf1OX*sGynjLU~fyN|0-`h|_CuPqM4V zC=^wxwU9bd=ixr~SI-yLAS|2wfIOF^MAQo35|N2=$C=rvJ%@cD8?wDd)}LL5e=Yo9 zA5KM;9*g?uHf^*F>TOBxB9j?egm@G7-<5U6ydyvhMPSMYULL#iK+lrvGv=mI$!~?N7C~M`g(Yzjl zPV6|}UY9}0o^nki&XQ)x0_#vx#I1p@MV6wBYKOMOzxEOtg*96-pQQw4Icg&ytvr6V z44(@6on0adG8?TuY28@}y2+!OKyiTEDCs+m_2cvQM$6u3P%sLsrvh*`604jMs0ry3 z_mmHWe2jIL;X(gdf3zkR98+F2{7m?V@Men9v~m@BLd54fSWH_iBC zpoMfyd6Tq7G8XYs#5u!5D8o_4nu5L*$%5Ph3@Vy%mEsny3EFJ5t#8{}$;dmj%AxDj zgQAs)(6sI`)}mt#D|5vSad>N^Z#pe?&j6qbZJ2PNbYdnS#bA|225<@%&0sB-zpxF(&Ot zNDd7+OL>N7po~oV6Fwu>XX2_@OOoHxOu{l~4$>fbCQ)NpS4W?w8Qaq=WFsgxR+=O` zk}qXd;q`PzWGf$f8m`YhEXYgSc%r#U zGRAI~V;k)xxfx2KoJp2p(_)!Jg8h(2fY2+@u*7+FAjN=WW!%hDtP zKSn268=TSljaJjbc4;+Z@Ih@WF>V_zZShff4(Z3RTAGvmqRqaE=eE5E?R3wj0TCdSDdFdHI5++#c;z;giehZ z-adASXx{$*LmP(_XDBid$K(Ya*DdY6qocmt_8(k7kbWtbSbOhn(?_xJ<8$i4u&Va{ zPIo{kPj`&iq!WX4qK;PXG^Y_;MLs=ql}p(`tSt3^|5gHO88M&q{S!2ga< zLqBJWk-|FZiV=xv^+U6W97&!=Rz@wzs>R-|hMzMs3Ed$PDT` zhKOmjiXlJqqMbpXka&Bo(A@xv3T@Ku*ycZIo>M6#PQFI-h`UFW{VAFSxNjQkKe9v7 z+E_`pNkK%wzq1ArlW1>2^tPZRs%gbX>#c^kzeSRbVrD#jEi&ZCO5VCo3 z@2KNSt7Akyx12cl?e?zYi7L9=+IC;S*eQ~Z zDB=qp3Mq)Y6k>JMw%!(2By56qbmD%Tp+T_<>c~Ic+oLE%7GYQg>6+w0@yf_PhV`CX z0;D@JlUM`Mv9aEr!8L1)Nmqmp4GP=VeBzoB4@5uW{cLfE+L9%S3_*Te$454LpShx@ zZ1>mowxEjIQhe*^hkws4Mf{4>`!<7nLsHck%h)*>k`-1)yihbDi=#UywA)VS`M4NV zh@FYBUSq6t(;-$x&F_-faZi9&BLDlG|Gm!6r0uVJk8@cXS(vc2|7D*+Qu(`` z27PZpKHJ{wgryjsNt!flLEK9aJ1b$k9lz%jt7LJP&7fNJKHK`*Sf`QoQ?Bf|J0p8A z_IhHK*U>(WH6PJQcGjEQ7uhw9MKO3fJ}D;|Ygdv5p0njvLf>|f#3?hk-Or+EC+<{; zHL!aU1FAA?^N?lw*R_o5O?N84mNh`9q)h{9172+Oia3`h(H!Vdw249;!b!Q zc`3y?x`Rjhp({p~`%l&`Mx72VdSMe}Z^kO9689X5z7}YdJdD;LZBi#&>bMRRdAdzv z^j*H8qyJXUB09G9JG-Pw7e@Rs+KPJ+|C{#+yK#50n{#WBBt|+R-)Y;42~C`B84nA$?Uq_Dp&ZHbJw{F?m}1JDX$)q;2vJ5e@&FdlW>AA!E8{EoSOyh3A^F{rHA; zwcjuNzkmPh+%|FMuBQC-uBI5@#u)dx{_eXj(l+@NX+-}})aaWj<9n?#)CzHa z9NN)$PxMz&W%#6TqDpWdrilOjQa)2~k12;=!FB9+$r8umDvelzzoRJU$23MM+R=Ar zSKGBs>!Ka?ATGw>nCe5&Dp#Mc z7`;iq8_vL-M4Ni7KL&?wS@uCZ)U_g6l+q_=Zu)igwMT zFgLXr0=mjM6*LoZM=eQu<+z@MQK>)CFr1$il#xtG%S21tD3t$cZb1jhf2=+p-LED7 zN8lfgEG*=&bkJYUm7opHN@M4u6tX9&(YKYtu7q@i#@p;%gk2S)0^_oQXoxKFw&{7irTm%}F#H^pMSxEg7EBCKd8BqJ(B5UDFZGK%PLB zR05gOHNy+V9EKjp@V>^V)UTs_4R0~p8U6k)LI@cdbJN&uypwg1ECq$6Wg(6KJnor) zkJ0g7_+P)nuSBd3;=BBg?JmPANc@FXAJl4rL5R1s{;Fq_c>KKr^wQs`P2xL`3Q$Np zHSyO2#@}}se+xqQ>zc4GrPTrb-2g>+x?4mmD!TW58L!dGpH^>zgL<4R;t{@xk8J$C z5490HfNG3MYdvwli*zS;3Sw<8_Cb`{MdqNj2i@=aF)ZxGNmwEhv-F zJw@tC_eJ3KxIare2;v;=8Oi@?&qb@m2L46~yu$+TJYc4aP=+xU-bH_dLoa$00zYp? z=AiRdsTFM^n2PsHi2saIKRid_WS!V~?0nXlb-~*xE?`M`$3zM!No5z}PU1zZ8}1ig zjFos#b_xD+uow2TeIQx->s=RiewoaTzozKNvRF3mAq`-cvn$v@Xmv2R)0%IJ)4d9YTUqXWOLa(HlHnE3)v!e6T6w+ z!fs`^;f-y#vnA{fb|+iP?qYYdd)U3~KDLbAk2i2EXAiQ6*u!`uT?=~z@6U6yRiF7g6=-+aw}5=cK4)LBf3PsiZ)me0{8}Mh2HsCe z7RfE;N@Y@|G+ml4-7eiJy@$7#B%1n}t~5Pn+Gg5edd2jb=>yYY(`V)|bGSLu9B1xf z?q`11yeD~n@-K>0NmeezLwRXRhSFcTTp6h3E7O$O%3@`?vRYZEY*uzEyHhQx@u{6s zFHG&8+9$O<^_tXWsq0gBrXEfG;=)s1O{ln>h^NC{oUT`_Hnm=bicg&;O@EICwH&xUfq4_PnO^I{`TE(|NQM2&2;J%cww-^ z6%v!IQeP=gDwnFH8JwFprGJ~wKh4e4rk6Q4ADNDuC9~CR2RGeyZssKati&tlDGKMt zrDW^eG%6uwjJ@t2j2{ zSifWGxc*PQ=Xu9AAH#cZk1aoT&(WWb?mu$g;hztGfB2ijUmyPB@QK664#VCK|8RKk z;g1gc4p$%c9v*tQ@Nj`KvR)$Y;J;V#@|k(k3235=Da$mOPMK;=&89h2qyJ3Ti#p0h zrdv&Sn(o25`@}VV9cN6d+m1y|v@mTnZ8mK&J#pq$jDQ}dCrmGz=W+7f(4-ejmm^Bwsi(=M7L@kP0CPb}U5w~tb%vy{HvI%i(36EUii2Qrl zFYI6JSN0p?ekjTBczd1u~Z_B zl1AgrOjdaF7-_t8rF4}vL7FICEnOo`k|s+YsRB`}O7cq8QjIi4nkt2)Cia5VEVUq( z&A_{mBBhz^NA{DHA}NS*c~Y(9GjBC-WB+77OZid(qF$*qRvKrDGbJEi{zH$JUm$XR zZVER!O!4M7&2O3CHNR&*Xx?vr!~BlKNSpB+mJ&)UOAVa*$ zmPxNkuS;)8`=vLf1JYa4+tNYl9qC*6 z0IdL42*A!6>{H-Tlq-Q%0K5{GFYqPGH9F|rS{?By*XbY+rrbwZ0c_CmAj*w8s4d>e z&G8sYL>!JSC~0oOR{$LomIGUL97Rce2zLXI>mXXU>4-zQT?gJE2JaJi80C{Xh!6NT z$Neau*6|ujiVK9#fM;|>qui;3c-y6e=BM|55gfp79Z@Ks(-DL6c^$;-9vwvE3p(CH z`J#?DQSQ}2w7&%G146*dI!ITq=x9dys*Zywi3dUp@VbrzDBsZWHcE<*g!ciOkLG^| zplbvPps@(k0lG%`2zVEG5BLC}{sfXM9TR2%$P^q2D5(#DZ0chjhfsb3P)X-L)iD$0 zVI4MB;6Ap0FLRn4&`wj*P=Y3V-`x%A7M7|xel`XFLca7`41grn_ud<0VUZV zVJ`5sjvG;a1AGh21HRL-5aste7NGnA_z_qH{G`K#@}D|xM)|XjTT%X^;}(?v(s3Kg zUv=D$@;4oeQK~w~zFKvVKmD%b4wV1au>_?CoCNL!{?HMQ@=qOhl&5s;5vrFgI0oO6 z6-YxJG)n0Lq$_$)o|FNk0-1mtxCrPA3LRn622gjul$JeE#Pe+1vm)21ArgtUEn>S7J!@yX6g$$6Oe6~1bIs& z>wltzoF&Lt%Ex--d;#L$)LDS!Vd?@TqRm*8{RE`0D6bSSZ$}AQIUpYs=HP&SOi$~G zL%Bmo0?L;K$e&EF2#~#-5E}^6wJ1LjFjL!)fKNd4F_eb{$X86zH-UW7L}LNuPp0EK zU`wVGIvglJ(-99@NID=_vq=Z!YBmF50Ay(f4;+xO*`@=r$&7J1-arW(<#-1rbjbld znIm;TPiF8>kZwfTT|l}4<;4K((fmFD*>Ze{@>v1074see%4x}SfcY4w4&~3lFQ^BQ zHo*^eDm7dE1V0MIDGJ`@@YkmjPC10eR0-78Cg<)}l?$|?afY*1M(Ak9MwITFnK zP_7d&!#0%-0%nrQMgcR;wMoFd7v*LF%7Mx=0%j_A3YcF)xm&;t`J`F|BYT!Z?pD8Vm5dKBdy0up#iy;DE} zPpL}P=B1^1`covz6$&8Y7#Jm z&aN>6)Y^S-=dP zb*~gK!ydYOfohBi{dS)sU$k6gZ=j<;QGN@22OUW$ ze*}I)Jp$!F1x!&We-XgipJ`~PnZWzYO!{R52a{0$*To!6+Q+0{6F7LxqufmYotn$K zqd@PD|4DdRF2hFAX}n#r{X0wPf~z%}T@cocH+r|2TF(!=HB!9`>5 zrGM|VT#$Bt^abwwVqZ(bQg2?I>7N*pg=3%G33n4ya1ZfP+%fEnJA?VS2RMq2!yP{Q zUNwk4@Eq)N@4)(hE!O+A?|KpO@Br4Hhp^833hS&^>|i6XQ|*LZ>BW)@JI#UEQI=x2 zI7Mob=HL#*B5AR7m-K+N68o$z*ke5_y^MX@JJQF}A?dL6x%4CMP%x7f`@v+>C8jh} zUsJBB*i>%1%5;sX0(UGLOfyXj`2C3oO)E^RaDU)&)6=Hirq@j$nvR&hF#TlGa97D@ zjyI>6yO}RFr{m62u6d++jQMJ_&)j6b&OFzAv-uA5z2*nakC@k(H<=&DZt!{R3Ewck zja}sl^N;4=%zuQ1g++&T2~)zlhxH0`g=L53h7AoX4!bg}Dr`zvW7y2Fd0{t&EeTr| zwjyj@*b`wp!}f%|5_TZ${jeipUxa-Z_Dk5mEoO_|5^Fi%l4|K`Nw*BJCpxnzf&G zpmm6~*gD2K(OPMpVx4B4Zk=siV7<+Hm-PYbO6vyeW7emw&sq0b_gmk!equdt{mS~I z^*8GuwlJG)i?emMDYlDkeQa*q<+eQAFxzO`c-tgfwXNP3vR!Mt(RPzU>JBL1+O z>=E`@dnbF6{UZCNc9%WdKG;6QUThy@pJ=bNPq9z4Pq)vuFS6fmUuIunUuWN9f7 zeV_e+{eAnV_Al)}*nhR3l*8p{xs#kEUnE~DyX0(nuslRAmdD5w?Q05S1HM6g4VpT+}sD-l)2$=BQaww?y3;wJd5y)VioGQBOua8?`s; z^{9hUA4MIF`bX6FQU8k4941GEBgS!_BiYf-(aVwH=@t)(5xP0`my&yBu0`i|)Pq92Z48~teX6Vbb(UyOb&`t9fs zqmM*?5&d2CFVX*wkz&GQqGLM6B*k15b7_n#COc+u%#fJkm@zREV=7~v8s9y2>; zLCkG2cf~vqvodBw%wsW6$2=FaFJ^ztyD^`{9FO@b=Es=dV*ZE?iC| zyESfU-2HKn#I29p8uwJ(?zorY-iUiA?&G*)abL#$5cg}`$#`?TJw7)6{P>jk?(x0j zGvf!u=f)SskBT1`e@(nMzAio(KQsP@_(k!z$KMnGVEpR%P4U~}cg4RH|3>`#@t?+j z7XMBBKjZ(Mz!D-8;uE?gq$c!8xGce)kd-hfAunNMLV3cZ1Ybg9LMUNI!kmQp33n#k zoA6-5>Vz!`I}-LKyp?b`;Y7mM3EwCDD?xLboRQ9WXR@=KvzIf&+25Jt9OfMD9Pgau ztajEro1L?q^PIOh?{q%o-0a-peBQawx!?J&^AqRMPMtgT!OM!%(sHv!ks%6~DBO*{ zl6r3qUa~e5?-BGCGzI+pLQZ}T-kgTF5PC$BQxU)mJw5z0$6te2vQ71ff|{r2<%^;q zr@&K*cc6OkZa5Tq{IgQjD}4dHij&?{T-jF5tMZ3Dm3Sv_sPc3zuhN5wEBR+W|E$vM zcrSFQ3RHPQ1%fQR43vm0;B?`&xS+A%^f=zrwE{t^R}=+&G%x=g(nd;6TXhH@sfK?J zIXz0v>DmyyimD#(&mp>N+SP})4N==x9a`ZD)B;5zyrdJax1-M@K{(#6M)Vi)nSA`S zND%20MbYUweSOMHhYKke@*+R2XqaybRb3hVhP6#MrL8)QOMVLf9Nv!3sqO1Ecw22l z9p0$rs~o{w*745~?b_6}tB>GvtK**|KwTYB%zHHO&*FA%8`{;2d5;G1>7gI@!#nzF zy#=tkhME!~2fPoQ#8JWp;pd+vwM`8*oWNwCg?x5bgw`P-_c z{6v6%mbN1%(5_y}Neb}KGTt)CKg-(W7;LMSRpM2@colN+blGMKW$i}gWcB4oX-{FpXD%&5HN z^(x+PCjY$Zw9U>uU8C11208nA*)7Jfbexf!hXQZ#c28@=Q#z&?KG2+f6k)@^Oq~T5R z{+6aj&RupEKjOckAWrlXMK(WQ^SRQ}bA_OD#Ynkg!u(v`GM`d{D?Oi#9^>dm7C$QBT1)GfCXRTK)=xjl zXGrVE$4u+TXGrVEhfeFqyQlS|R0bp9W2W`v^QH9@cGQngo7S&@H^~x1XNjS+gz;o? zJ4nkC6J?2svIHvydJ{2UmY6R~%$FtR%M$ZtiTSd`d|6_?Y%yQ9m@iulmM!MX7V~9` z`LYFL*F;TXdC|gXFEhfs&!#hdwu4$h?P-#@~Mo)33+Nj_iz~YS0s7x^`(~Jt@ zhG^4dRGN(n-fb%`%`hr6jf&7wMrE)GZyN;>)kXylEzY1tnk$!BN8y^<;dDWIqj5aV zsPKl6bb4V%PIi-Vw%MqNaY!&}t^$%BM$MXOTn$#@S22tOT%>s6siSvg`aE@bC3`i_ zxm;;|5v&kr@RHIx{+?<&o1RaZ6GZ{0&UA6nBl6(gn0g~`ePd__Uga%@$i#0d;8!E? zeoc%Y@K-feiVNv!!6u}CdI>OZD58!lo$J??&h_gOG02t973)gRCTc1@b)o}TtSdba zBE~C_@v96-h4fx%EVqzZ5Cwg~shEKKsVj|}mMe`Lnky}jUIDyE1a={e<`hhk#B+-#UK{NdgNFL6#7k2;{CzmwwqF z;8!!ne3_X@1T}#sC_|hU6KD40ulk*im&NPsXNp-fg@iL9VMr5cK3fJ#b9nRsas6y7BY1UnYx8c-GyXjL?*r1z8OVB zr4R^TBe-0d`TQl1)B+1Kc8MtM5>eVEg04%1U{_x; zp9t2jzCtP@O1nhNc8Lh?>L=(F!P=FTPVNA$;hpT>5KIR<2JY{MV`gO;C#eCaUqoS7 zmfPq`{kODm!}Z(|*z8p$;$U7WzLYlM9GRRVreqy<-wkaCXDRgRErj*xk_PL2>^woqA) z(0`7wh8$s+A~(5mgm!X-{&VyWf=0wxq9s=hog<_ma<(g1pH@tiBc{z2gNY@8D_4w} zD}029c?>3K5eonWeLh2;-b75Bn~&As=_r;bsLs>-=|t%B33Btqw0VN0Jbg?d9=^eJ zx$*=Ld7^usU@T7%$X7)OWkN3bV!nJaU%nVRUvv;_5|>!0xWrnH+ zqEPfJ6tfoyRtf|wg@W5ceRd&J`jMEnP#;>KT@YBv zsdlGvTHI-TOm`Y5$(_cBcBgS7+-ZCUw^)+9(>N{eG){{qiPFXFBDcEJ#n2+*xk`w7wCWa#)GgAgTO?Vx z$h>ZmhutEPx7|Re$izMI{ z+18yY)F^VIJ5%r=Qm8vqXfsnxo5}6WEz+?&Q%GK9S$C!wT4YbR$fa(PS=}Pfx-$i3 znL^eg!Ma6)b&CY+7May8a;aNnR=3EyZjo-?BD1+UNE6lv7mS4hGwm=?*` z-B&18BrJ|ytEz+-BK2*SEpnt=WK6e6fNqf^-6A=Ep86{MNLoX41>ScqvYfkLE`F8( zZ>|quJwpN4&4Vg_4^J>H(x|&%0eXqFBR)^>;CMdud1{&(@ydTsO+X(+^v>ZtJ^bTtLB!L%f;WwNbDjTuA4|#|W+?zC(rWN>c6tPGR;YS9V^~E6aINwt98#{QP zJ*^*UJ%yq0cI%**2Faj&gPS9KJnndDJX5B*^83<{ytR{KUSYd2L z9uJENyEv?OSpTq!ut3<1u-Rcxg}od0rA4x2So&KASqd$~Emz@Nuv;v5Sk_y9wT4+` zYmD_g>m+=qwcC2kmTK#6%eKw1&9}W2ZVt~2_l8dkpNVgo9t>X@z5(Aa?GAq-{H5^U zBN)C}>Jf2SL~cY;#P|qL#2pcvBDO|69r0eo_Ywb!_}zZ7JZfJgOjSWK=~|ZPe_jyQ4NlJr%V(YG2e_QSahA zn%^B!j#NjQBg>KRC~_3zTbXKnA2ZK!E540+$g$4xjN>(Y3v<-*jpGN$za0N|oQjUY z_b=(u1EY(huZgaW4n(&^&yHRgeS7rM==-BrM6bbjE_PxZL%OS$KL zXKuyzeQ&^S%`iKX~8z4a=`@X}!C4p?)LRh>Hzif-alyFw2OLm)B0(9wmtIl%iH|HHOVjSwCwVfY#f-_ZQ!{68SnW% zt4TR9?e*Z;E|abajTt@u(arVAqsLpuJ$=yoQKJ05^`QFh;$^o#xcK4D_l$X0J7{^& zswT89wPaayv?B|zT{P>anVlCcU-ZDDWjX4R^M_b-wZn_9yXpExGds_Ha-ez)?HsQ> zx8{qK)_+}`bn>@LlVn@tjnh2SLU%3=CJ(b+zk2-*I}$3ZI4W^ z+&nl@OGv+18=w__pRR_#^~59F*QboM<$JHvGHyuzNcB41qYkRF8ujd3-|l#J+T=AU z+HBjzX%ibK!cM+_XXmGDQm$BMnJ}}mp)}Do`5+`3{>1xVy|k&mYI({h>n$JG7j4f- z)ROyMtX-~Maipi(ImO}J|H2Dz>>smx*zoczhYf#m%o{1Mh53UkH*a3GV%_?c%~Pg? zLJcYMA@!~$58SK$+e$qcb)H;o}{H&}+Gg4OV*|%cv-QmyMwB(ujgEP8}+CK4c z^6k$%YeUOcu2^~hmW?ZCHHD_l@~1eqt>2uRG-X?g+?sb-`(B-^PCKkkQ>UsQ9X{E| z>UhV#rJ>4R(_)tkiat!c*uFRk3Yc+7Yqn}G&2)*@BW1cx>#3T1s_DsU^C4}9wa1WW zPu!T&+VjxKp4Jn0y|wFyMA@=<>EfkJy4TzhNtR>QM}M-+TEBkw zrmO7DYD6idyk%=cksbWR-FNJbU%R~Kc`EaY@s;Bz?yP!q^{OTJEl+N~a$L)(x#6Fx zVNPFQ*~&-OE!((t&8$#!;JRwqz|O7DANjn?%f9th)l>ZyRcnKfElgfCzOJ<17cQ&4 zElcJuT)ZH0-hu`57c8E;cy5Y(@TEO_$Eq1cR;@_OwN$7Dw!LAQ))U7q4(E#-?^?Dt zze}CO-vj)d((~-b%#3mLv65HW9#d&XjfC=DRQVCBLNIR;muPl~j(+ zy7@9(tg)?_>04Wzm^wI1OVPR?&iVGmEz2KWoig55I;BGEJU4l3iA9aPJYc(^)X#rEk99{^G}vZ4de$Nzq2ys+y`pmGC^3^|71|Q?mMcYj&z#Zv74nZK|qj zm|7z{-?Z*kA6$IT;s+K#(0TE-i)SvLvrk)o{(kGfTKie@t;O1kMc3an=cZYm7cIN# zzD4(pR#%)q(mGmuc+u>e=PbIu^ZZ9gs*hN5tq$kO-2Uo&R_&XUdn_Yb#~jwaw5i{; zJ_oU@%7E7|(c~+#HAQp0*HewzyL;uvEyS?VocQdAb5hi2thYUU%LDgx z(F)Wg=gt@Wy>Cm=0@e@ie0=Bo;Nx30`WbahN^8CQWYDI`Lwv)pXx#9^wB-C6%Ye;q zO!y_yaj41O`hin(w~ycFBaEMp?OJBa$=m-XoU7%oBpJpuf5C!z3l=Y2GB-sf_m`b} zw>+|bWlH6Ht>4*lYb{!y?U7*3L*(Cn~)DB40whmG^TGiC!N7dMr2W)Dz`-qmB>}dV^wj_B<(#dcwRepSs zMU6grKg*kUXvoopo{7*I+}Ua)uHmK$?kbNVRECYqp{4z5_Og^N3CR8WVl3USv56_Ow#VAkd~QvZY<) zFC9~{>GNcDL5_BlO^bVF)OXK6{=nmFlj8?Zey6pc&7sN8tkx+b#?pte!W+vg61#R?Rv6?k_EBY^D}#TY8xm|Bz);*3(wi`QQy&n0z|9 z*4X9i?COx?$4{7VkS&*6W#>Mtnu&mVh4oTx#e!K2Z&*09^Md6I?_RL12LkF9R!38k zdhZq(s1qKvWovzreJUm1H{aBLP>-nWdCRgp?_9jJ%RRGiyYaSU?f%`CTjwvhbz!2s z`|aKGwhf!NZmr*3RoO75re^(=?J4p#Ny+jpM_xIi?l>&TVOpn4)lTX_bJ5jr8?D-Vx179MeJ@d7(fs?U z7n0=Gen+(9t$(<&5=m5(Ef-t0Vr{&o^-|K`A6Fbx8*KmhN`738fBgREpKN*VxvyFz zHQ||i-rD-ih685x6?tOP+$DD`yfab0JxORmzS*Mocc1+ExSEA@?z|k9d0Eo?wq^Cc zyC)Cj!5#+xkuyPYn>v4 zsTDUQsn?%;Uma|XpWOPVI`gPpkhBd(AgNWyzdvqPt9Ce#xBl$5{=QGU&3P0#-*%Fz zU0a#3=qb8Ix8AQ++BOwgempr|ix{fDcEIWY-|E#zPF|O#UTu}{YyN%W&vseMeoD1` zW0$wBhjla{bz?mu$r~P>(ey}4;Pxp?W+Yd(R85$KM7d?nhE1EMt*@<})-ZMIn))p% zj!s`&)n4jdSlceO^hQ-%YLRgc$9Lg8ozwWafB$~iu0C>HZJ__nvOh_EQ0<%~zowdA zmDJG(emP*4TYf`|Z2cM^&8-t#q}J`wS8IHW>TdbUm85PwW|jvO4eFnGwddjIrlj<< zjoXHO2Ybrz5RuRDWJN9>0ChT~BP=w`lt<2d%HF`_XD$>!0qE zo3znZIn5r2@Yy=KMZR&T`rb|%Cez`!jlqC80m?MA0 zSV@LTi#({+{Goj7ym`0IODvo?Y;5`V=^K&!u)w`z(b7BbSiB_iB3W%6q_qyT479aQ zQNzLV1=1Gvg171aB=gV68jHiQ5Z`pX^-m2U_jv26<0ntyQypn_gsE2hL3oM$sQn~X zWP`D5G7Ye5yTT5s<^fi@`KRsbv+$v3pp?#X>$OKuc2hrV?RNC!wN`n%x_rBI=t(u@ zNwfO8{F0>3{lKiwm0y}bZC!RerNBC2M_Km&o3BVS|E!BzN2;X zk&~OPa^}gOPpHde)%=-y!)J1rVb9gPh5&asTOFn@zz=DI;#T#OR_m6h6gI}{KKvMslq+{nazFt=}SC-foC)D$j9gWLCuF4 zJ$|za58Fs=1%E79vf_0eETSJCZD+Yj^sw(%JjN^0)3taQ1J6Oc%AbaMO`_*g@yNyj zi5@(CTcXEKKfr^h68liX0|4w}i5^76GcU*SRH%eke$eyF9*NFcPQa@0kdK6?=JC)xJ>i1~LY6W-XwN1yJnE094;UWVm@d)7$B*&H zNES1CD9g|Az&+kHLJ!vF;H@eQPyI_6@H75cZY7h@Y^s?}lUS34hZpFX=I#6`=O-*| zmqd>PzaY^=S$M|d`Y<*x3@)0dnQ1gLjgd^_nP~zuUByfjnaRUUlbLA} zGhI!O5Sp%GrYdHtV5aHJw47d$U|PpamCWRgGtIb={UMni#O+tf^pHggW6+OjwItb? zX)Ti?m}$KY4;bRPL(?v1+R04MFgyW)#|%wxG1CENdXwQ*3#K=i=~)x*-kP2_n_g$8 zy4&gs2DLTS&0HOg06L5SQ4>!PYeGH$%!&hPW3=QD_;f6eXHijExxG9Fu;o*xhd=Z8(#qfm~K97f+ zVE6(IU%|tdW4JknFTrp#47cFn));Pu;VUtGHHNRl@C_Kg2E*54xGjd;VEASX-+|%V zF?=_MZ^H2P7`_q1cVYNW4Bx`TT`+tbhTHS-y%@d+!#yzE4#V9s+zrFMFx*iCcg1jT z4Bv<0K0MqL!$URjNDVv!!xfr%Jch?$coK#uVt4|_;RiYsFvRd!9-hMkx)HFX@MH`) zes~5B3?(2V0XGRhz{7KSK*YjNa5N-fx&lcRct=3-!V57Vlmbr`D2sRz2IM{91OhDu zufTw$1l%W}MFIN@$aui-0$LY-jfdA@khuV;diX62zlq^DF#I-#-^K7d7+#0r_b|L3 z!y9>c1BN$Y_#=+ki9hBjmv}P<1Sk9%hPPvQ3x>C0_)`pT#qifW{1t}3#PAmw{v5-9 z!|*p4{sF_^WB4Z?{tm-GV)$DO|C5LRh2abjM;Ojx_*V@7g5lpVT*c!72}V``1%-s62_m1@uy+@nLPdsj6WUY8)JMUjBkkXXJh<@ z7~cfrFUI(bF#ZaRzY^nHV!-#|FUR=1G5!*QZ-epIVEnZh-x=fY!T2s1-wNluV*GW# z^6fDGUW{*#_iX#{fvdVF%=axyF5s_dre3 z#SL&vyoNu4Um%zzSS;`soD!4^ZVOs~0Q3pyKl6y4#93i~;R0c*@DELyW`^dUJ@6i~ z9>aS~01{0YsZSb`@njZxNFCO=N4_LKl7Id3>n~CWX?Xt<_RBdSsTlN}2Vo4Gp20n% zfQC{FVT@0|@_>3W8$uUWzi#@q5P}wWe{K2oPZ3YlOVnSaCt4!fAj%V!h_3YN*UPq7 zFpxfSdzJKh*6U60$-QR+p(D5Vg+3IJF%*4DfmSh9%Uo-RR)|)H)+wzDt!G-_DJd02 z9iYxrwbYxwzx1X1PUyR-ZvYS)PV_D7`w|EY!^K8oEAauKCLrxa+Nb)>>bI!hzJ4$J zFYce!|8@V*I=ytp=`7N5*D2E}mrxQ{$vMdd$y3P}>0)WHbiefV0CK>n0Tu%`4^Rw9 zq;=?%bQxVvzoY+_kuq)BDp`o^j{Fz-P9)*C!~@Z!O> zgBu3_Hn?L*&mp=)LWUAUb%u@`x?*V9(9EF)LoW}lANt!+)i81xJ#6Z*Rl_z7D<9S{ z?9Fg&c)#J}hA$l+HKNxD*@%fF=8jl3!f8avh{GeQMzoJyKXTv5q>;Bq^%*s8l+~#1 zqasJ`A5}YAGTL@@^ysY7XGXV-F&^VTCU?yFF|Wt`J$A_0`D3?_O&oh_?9H(+#_`4t z7-v4tZd~@bi{tK&dp%xrylniG@%G~{PoO4@nP5D@YQoM5{u5Fs9G_4z;rT?~#E}!N zCk9VEKk?P1UXzR_t)65*DR?qI*>7_C9n=e9H%L!B~Cjtec1H88GUC&&4`)tVW!s1nKL)d44-*=W|N_t zVVGgKVXR@gVXol?!!pCGhBpl#7``_AVEE0bhmq81lF<^Q4My9IJdMJQjvC!I)-s-I z>}y;%yWecR*~YUSW*?hsM;7)LJQ9IeVq|%HOQ4t#(=kT79%$VZF&Z$a=qZ zlQpwSx@zgFEvxKTDObg>YFZt&X5E^sHGkO5v+=SyU{h@Kc`dP4AEGP;Yj3T6z80;U zvrf4#aow?X73-<>BiC&yEavA`omV&cDJq4 z_L%K;+ut|$+B|CuvBhjl_LinCe{7w#b^TV4t?66qwyL&SY&)>+{I*-$O}FQ7f3~CF z4znFGJC5#nv~$Exubszs-rLo0*P2~hckS7gva4!$-`%rzhwXm6`-2@}x6ba8U8CJ+ z`(^g$?Y}$Bb#QbDbU5cw?a=Db;V5;S=D5Pq$1%;Z(y_&{(`llUuhUVdYG>Sexbqh0 zH0Sfq_0Df0kM|%KW0!R<(JnPEFZTSp$9hlnp8CCddlUEO?me^j>fXn$qg`jZ&Uf{5 z&2X)Bed{K6o9njTE!6F-+Y9&p?uPCQ;TLXy@EGD@<`L?V?{UlHg(vN4<(coL;kC-^ zjMw*lhWl3SbJ-WY@94hg-cs+`-aEXjeERzY`h4-7;~V39U7@LvD8?vE6}uFN6c3aG zl&h3`lo`rWWwW2I-xj|>zYM=~evkY*{LTFn{V(}924DfY0kZ;(0+t7C3)mZw6L2-) zW1vpp{6N3J6M^-Ct%09{h#)#>c#vMu;-HN|&Ow1eX+bA~&Ier$x*gOK^d{&_aGzkk zV3XiY!G6Ih!H0s+2Hy{6LIfd`LQF$!L+nE0L(YcOggg!9g$@dx7HSge5}FozIS*p zAAKzPPW0y(Nz9~}1u=dx0Wk?Nhhqw2%46zcp2z$Zs}nmZc4_Q}*p0Cvv3FycIBDGO zxWKryxRY^JagA|r<2B+X@kip{Cg>-4Cp=8-k*J&KlIWj!D)DO~O6*9YlU$R^lkO%x zOD2;yBp*$_m;60NoFY$|o8q6^JJmcjEcIjB(6orOGwHviFGvr}AT#KU(HVLfb264@ zSY_B|IAr)|L}r}MD9vch_#>k;Q|B<$nfh`&Z!T&xc|ZDSTKXcqBBk5TFNaxKQl~ zXKxb5%fR{BcvZkI>GFvSMPKQ=;BVy!SM(7j7G^t;Pw`eht_V;TmN z7gTK{Xi+eU_)s~!9cSYHnmmg};(2Cd8~JE9jRKg4@g!^ceUcFkw(YPdD7A_AwjCX6 z!{2JRqhY8YfefxA;?0*8U)Wi4wjYw}5y(a5AO<&KDjGn1J!WKSw!>sN_}GWKU3Wvo z6O>nS^9hoIYY49@c#i+cZV|Vi6CgX`&SPgC>!pZ#^%2cQGp2rJr3*JZ+3%JkU!mS6 z0otYdC|+TE;*6afg$pknDLzsqeNkZqp>{3n1ruRaTRK)wq8Yp+elUqr7g^I0rRZ`g zS_kub!_AZ(scI0fCL@X*+)%LF{lbH8NbL59J5so7A-Cd;5=v3wK%zc0RbGMmtNMw@ zlA;v1Jh$c|ghTCM_e)4hW)vfXV(P*t2a>wTN!`x%Z3(8}ZFIaQ1}jTSMMZs;(SFTRb)+c+}lun=cGp_{a`pK#Mf zs~gd*2guZ&_eJ{&k%v|b5KY*#tHJxF{y-4PjRKY+4x?ED^b3*lK*07Sjv>+~T+H5a0@$P zYURcqmOEvZcRdfElvJt$#MJ9qRweiDTseQINDgjMOToI$)^^LJB6I}4`oylUUervY zwQV@lkJT2p5;hlE8f3#B335gQk$%-hnE^3k#t3#GyII0+`JL5zJwwK|c-n@eVd@sI zpZt!r&=v{WJOT|I@dWBuuSdG9KI<%D_p&rQ)MmX*gsPg6t~>8Bvk6B|=$DNkr%+!S zY18O4stl&}-H-+B$weP=bdsI7gG7m~yatpg2EV3{CFvv9r{SG-@Vci2LwB@7SPFzB z@8)xK^CgJ;S71nixMq9rMnk|6+vfyB8{3M+`>0lqVFPmxI=Iw>(aT$(uRwx=1*T_Gk=wQ z=z<}}tc66RXl81fwHW;urZ1^BRHG16b%^?-4fT>!Z7m1vcn`@FAbwPN41RiU4*cy4HdWp70op z7dSev5TjAAkr2Mme$(Hwy{y)I*zJ;^K)VDe^9lPKv6fXmbQI(rK7XQC+FY`D>f|N! zCmL-yQLt6MW{F^P{(}u4rCg82kC3Z7?@1dv`xHkvp--(3A0SRo=zV5?UAo$Jhn@T| zptbmLMgN+w*&t+{RzqNOHESzj$3A9BG*%YYB%Wq^z4h6(+NaN|O{W+vGt*apS@bF3&>sS40!%a`GxZ*6MzRYo4HCJE4 zir!B^av5XHr{2w3d+}Ob*~R+0%j*}IuU$V!&i=`#zUVEjeDSE})=N3{=Eb$ehLe`8 zgproIA^!)cxQX}RDJq9^Vg^g#covXttB}0}jhhV^l!>f#=t#ga{Q7DP`t@$*fiov$ zuB_HTR)eMN0mz0@7bOQ%gSHJdCKDc_(>OA>t&8_?``J{*bRZfJu$ zgq;U~j)4Z?s7C$FMYSIe(7J$qqCrq{a~TQUFhfguXx^JUl{iX4 zbH(k42{axp3PQ6bUyPr^iIwS1W_!t6h)0(ze`~&IVJXJW z>I3*8k>cvNo6B#Y(3_}FwbqH62eqiGl6s1272;E;ViNP@X*UH5yN!X{0RClwdcmEw z^c^h40K|Vi8G_tYIm_QYW0Qw6<49a&YE+sm4><}}5Pk~;gn)H z^KKWNI9j@2MwM?!IP6>~eRTaRpaka*M7?1jOoSnhXPsFW^ed}{CO`u(j1o+G%1f7p0Rt#!GuB3A&?wF)}KF*aTW#3JMXjBhc*1Ki@vHt~J~*zjgRb z#a+p(Rj=6TGIkx&&R&LZ5cL#(J!oldvU|AOW)^c7JS6>_MF{*9a$XiE2qxhs8wU zK-EP^+DW7h>SQev zy#2i5D{Clc?O@eji8)15`1P3aiY`SGM&?@rtAsqNaOMK~Q~W=XpvMl!CLWYs(Z7D) zvQc9sl~ zEf(#l;tMgG(JiEth{3m zl0Rnm5^(=90qP4-)qMeWS7&%|cU!@ej#hT>EF|xo!^&p~MU2P|A-Dv5QHS_B!LCL~ zFr8pmu}JWoKqFD4K*Y{(1%T~*F%r_EDw@$?8q8@?49R;&;^>G%m-c@{qQ0;Ue_X*) zD@ZV%<~L|Inla@gt8Hnu2ZT6E?vB@A5IP($bZU_LHi<25j+}RvqX6Nttm3n`q_0a% zK(K1An*(ST=#Tdl_WFIr*dKjY!^evebaK-HaxVlBMd&cj97D$kk?0o^XNGn30=z_^ zPoDe)okhz;7ieB}HQEJI>kzwb42=Ta5M7FBcit!MF!D6g0DGw+fMkcbb!b1}A#bSn zbs>3v>{?QQ`X^tnMq&wfGOoDuT4D1o(tb^_E0`X+G-s#r(55aUtwREq*-n}eF}T}1 zxD`#A9P!F++c)i%7bOBBE45t3c%1pL8+uO-6=nKJ?vJhL?=ACiiR{6r=3x}(vuPcmM zf)!aWoB*q=?yjmDXJ)f&#cgK<9aHo-2#?s?9$PGBbqxly2JEaCfWN&{n0xAkoYl@2 zk6&{eiN2M${$763)#j)iz#H~^w%VF-n#5^0X694Q%9_+n?O+x#ITuK3)l-t7Qfo;e zwZoPasqIo;w^>@F0E5*3GNXX`d{davB2QZD6Oz!>MO3WtBq@(A@Z&i08Jxhw+Vuol z1+eBR1lxyw8{`%28|0=FygxWKFcSp$+y0XX5m#@l_DC>Z8EtpoeQh{Enn*t(H7PYd zMJGX#;FG8TG?IS*Hw3#3Wuo~gLNJDaMEL%S0G|MbPGE{(T0jbbnEH<)(0n#RAZmj> zwv4qh>as6+NK<WEw(cEIXOhp;mynBmO^&y6C*^1%0#S=TSqu7 zMm7YL+Xe{s>l31p7f{T36n%k*Vqil6N=JNzK)*ycJw#(ARl=)>&lbsY8r%t6=QB0( zO3*}SK4yQ3lsU~lLNtaKSnEm5g)CNJUmG9`5iSkb?#%L`L~omwvCN4Op+hZhEn1Y4 zS&j~gDdX3t?>5R;5R`IzsI!Z$lrlD3cwJvgDaYol=124!?{IJaN~|ys}!zA zMBjVxO$*JuOH$vFa{&Fi^SJmW!Fq!ToI|ktIxRSK;GRcf>ic-^OUZSAcP60>@FQAi z_=T`L*%ylLP@PJ+UZIU$hpymE&e5~Q5)R=lqgW+}@?L+`w$MXvOS68J@ux30MV2tD z)VG0tS#BeD^81Pnj|r??c5FA5!gdDqK)V1lw>b-9u=#vG=y=pudOOqPv0eg*6Tbk9z@sE=+rl@+ZC7YE%1ycC{j#<@ zrDd^zi)v!-j-#zRb#%Lz_wm}d=vvA4QZ4i=T+}6@jZ~A8Nk*FD|0htNYE=FotUjo< zN_OJ?(Wr;7%xY2B8dGmESY~*DdeZIj*NYE5&=KwBR^iTdoC)f10w2^)_VOT*=r(kh zNMFh{>>=R@b{9fDRM#kc6^)DH_FWz z*>mgdYCMdl+?39${m`3`a!~G|3F^G^GYN8=TYt6arkY_BNyOB)#YTDfK@1wCpQMFTsf=L z8$_)_39`0aIgX4VQ5827>N4tj;tLNhbLGrLZaCCsMdvJN&|U0FBi=WyPwjiTad|z1 z)j^Kjxb|@4+6&{Nij*T^Xw*65tLL*WoRn{&SK`2ylC~AFLG3_#})~_;kssf zx-oUFXpK8(<-cN9ieu?hDi^_i;yB|X5HTyCphZnQG@uR5ZpTqAJb&Bx;N3gp`=du0 z%^fxB;p}%n2wJn{OnJqbg3{8{+pMg&Z&@Q3CAz(BW(3XeK&tYdH@4y^S0QeFOFT}z zeBr>O=|}t9_-u8skxt!E2X}?=Lf!M?6HZ&wG&J<32A6E+nNdLwMs->zk2LeJii@ z#l`JKHzn0)Yu@~JY4e^uS$>nCXrET26GI(WU02s3vdv(Qcx z7NezO+*80Py+rQM!6;^XiV^kr+LtP?a~t#J=MH3@E|vUgcw+i-*_8bGhc8Qt&m6jW z@3f;^j_g*spwQ0j{BY^ODJw^rA6|FSQEuyLztvhY`L09bE?L9wPcHK%=4;&N&$2ml z&`q|~Qn2>aqfH;B_s}!(#QX_4Rg(N8hc3j++U@K2SW4_X-5nL6lgvPtJk$@ZJqBJ! z6Ss~lFtp3t8+OhztVzs$osIz}Pi zvP7WFIUaaQihg<7hUk`cx27JIQ_QV{$F73&Lt|P4`^$*IOITx>NKyM1yW7apq{G6Gzg)}q*5XEw1u4{ zXdxz`se-HNg=IAo)}c!LjyRdV+XW2IU7n71vQY%Qq_PBgm0pWR6K?P_ZZp<*Ksjrm zAJFpJOgi?3xW1yO@t}Nhu3(jNx5swrlHC=*Jv~-)^Xx&V9VzmWts(HDgyfeH{=aA+(WCYMUkXzzg==-~CY^wQt0?2RQ;bQ=iviSjPBS8nrbX9fc(cMCwd^{0RnZ^bl#a_c`M*yHdG2dRxzLH(_IMvGHxz)<;$ z?ulV|TAYzIlfBC7qpO0^1Zb&R0(RVdG;uLI5&mTbZAgHI*R#WK!M}uPJ*jvMS_ATq zK-;Ja#!DeSo5!(t5?cjcF3w74>4u>EGjeoVNbN_xU#d<|B&dpa;|O-0xz*CGvWDg0 zR<6wg0QnM0IU3F06wW=q`XTJTMW3_NL9Vi^VxPx$?nB#jAE7EiNz4xpd^L zpYLJ$456FrM%OK1R^~RM3!p0Yc!FG-0E&!q#i+-FW^g*nX172*LufpWVx{Pe?6LgQryTM(Z?T7t^T5$V)ooC!DV*<_Q_(_S^Rs-<6=Zhm`$kX zL$+tV@K{`K5s)dBhh+DKX)g9jTcnmNfJ~`B)2K=1BV6UUeT1)!GuaYgulbbG=r1-= z49flwWb>FVWOH|o=2E&+{ro2y8q|Ic`7H8zMf-?3q^jC)1*|AF?+tCzK11d~A)xU& zHx{VBC%S@ApsQ@`j290jxuUn~lhy%B@25ogaT19#J0HQbL*!dheVDkb*_52oc@}g< z#S_Dlt!1lQ(6q9mmOCZST1=j3?Wyv9j%=S&atr2DiwS+=A8O&|zi6bAA->OdsNDKT8oICF)~u0@WrTF1== z=F*W%$Fg(Sc{e7!lh^TA?0N{=9hHB-8d_aDVZ@5qUOSAI%R$=fAs^tw#uQyHmlmGi z#!?^;qv6nKplC58f1r{Rq6cIZ`R!u~xchBWNMx&BaN=mu8K*NuMcY`UQ8k%wiF&7$~*3I2p;aSvp=-w1gBth?125Y zUm<=%p!MiG3x6S^#ja<+3s5jB5Ti+K0UROtiwZcKvPmtJr>TYVSL6iR5-9K+I#2yi zUM2Odi&?2jb#UZLFn_zqm9Wcg?x8vENCR}#S>OEHl|M|4Vf5{ZVss2!a?6G!qOo-MpGX)~ut}(NxnOdAZtq?yW)G;kRxZ0keDa{~dnxBBW^b%(Xh4@2V z`PI{MlXHR%yVpCKODEVoeCjDjdc@JY0(LDCni>fty^M(LsB9VBPh4R#@j9!d`Lpy| zvAe@bdHy58DeGmKW>R*FA={IcxX9NM_9lY6M7Vc^udl=_!XwH{wuLKtM6mS1`$NzK z&Xb@%!!OI!zDe#lo0ig|zdAS%18OV%T4oCXaxJu^vSVl)<^I>qg=FVa4>9HV4|_#O zUHFHHr54^ST26YuiKd50}n&f{7Pr0f!Ad zO3;AQPtoe9=)w;bHIp4EeunxGey@<&U2yR!uz~t{q#(ZFvrvKfv9w^YFp1@}V&DW# z1x^r^6EGg+-%0SupA;L?qW=tG!4B;z=-TBA*m*xTuA&0jSD=L#chibs1-3cv%0Qyn^rI3t`BV(!&QbHY~B& zx7t;XOjK*Qigk~n;ymZECPqi}>*dH%`$w6H1C-_I-;uM96=G;!Ta!}8HDA0;-P}=o zuQ!yXl^yz7)-4RtwT_QqrJYp^!z7v+-4Q>O+u9$&jt1E%olP@|e~klsZ;ZMInA<(z zEP(s^2w2KE(BF=8N8ucJ5vI~fG%D$cH>cgdkAqLuSzx$&6}Zr!Z&G6hc%@K1(3cEq1688PUY_y!WQ*<$s?KM6$EQP0(HlXX8J*P=XI~b5Cc)*Z zwg-V633rT==?5mhF_`$ucu@2{-RGgf2jPc@Z)v!V9}a^b-+kkugm12-CB*RaE4bqP zaj=X1Du4gLL$83MaEbL3E6Bnd0vlq%l%M_(5z~Ms@Q@bMFdcM#KVW#++y~Xc9|q8c zBN4T?xVSODwrq6Qy7vrKwo{qtTD$m4Y5LJZ`CStMwf6e;dG&%rg(;V+B$djGZf9h7 z?ku^zXpw-*KeELpV}+E;TyEp#yj8yNw%O9U1%kbsmFuh|E0fnA+$LKv|K^h0cLa`w zB|g>C7XBpjy0>yF|IM{~FJ4`nH)gc?g7KiW{S)hjO?BozkFo3c)2fxA z%=%)V`;>~YWh2Dpduj0F^r!DMRzFFT|I5GigW?fRRI$baeMf8SMUus3+i%F&I3`fc zr6R~oI@y(qU}vnCIu!w|D4O{ISv8=ZaK&jgBkhJW&74EtF9+Dk^o4@5)_i$)N{(5x zA(h}pbxMx2*A7=mul|#gV}o?$ICV;n2g^QRy_|dUw0x~_k>k4cOA$%4QdBNpumy5- zROQ_|_cKSwy6qNfryXc5=(8F+rNKOSRR?BxE9DEn zzYuUj?y8kyFcJtb5iWzWFJxUWbGqqa@F@ILPs^1kLG9I2c6#q8si($2HC514%Z))% zeQI1ncb_I4<#0#I===0hB)Iy)Gr~Fh)4BHgo!(>Nbm7cG?r6n!vg#T(Tm@zp=Y)vr zoHZ8uL2=)>*wAE<9W9IKn9lR+ddT`4#0?Myr45#JxQglO>sM~dmpZe%`+5R>@wn-p zQ?-qyBTASBB^>1v?SzQjU9KwI7gooMi#)t?yW);)+i8}~1T+!>R{ zK>Tsk)1j#U?Sca*P5>PhIFNV5dMle>A*}L7`>nG(?6T$T7U6p54K6FCoNqGwJ{KND z13FFxlAAlffmqzD-tApZGuIA-7Wy*VG>C+%L2qfUYB{&(K>#Op)rCE;u8ZopU61V8 zN_FLQP6Q(XtXKIWPF!>17kah^$q6PB+y5JAd3Bsq=L>k)>^Kh_w}}_Fpnw*%yM>2( zKKtB&Gc&t)@U^--jq>~!_8XW7_ARVEL@(P~R8zqjTuCf&u(h#(9m>g-n8I)OfPX3} zD$)8KAwSzn=2Re0*d_6~}_6D<#`o70Gy|ARP^g+J-RQl13{W&(({q44H_O+E7 zSk=7um7@+K`d~zM8YrKm8o{6%IBq063$i2t5mh%xw$fquMr-aw=reiZSMen^ucg)X zyV+l&`tUV#^R?mpk?1?OB~Uu&X9V#Mp;l%Nw+Ev-SqQjZ0AF2&I-?SnWwHE$9av>sBiYwaQ`%L z-eE?Ugx%ZK2$sF38uqkxCCHp7+_I~5NvqDwV`vAul5>Eo8zaH?YIx4Yf%gKTlu}Kk z*(pUxqXb;I*O0~m#Q)}|Rb3ri_2|hWL_}6l-}j@NOf$IRH)g`-IraY|p$pZy|NouS z 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 PABx=cLXOA&yR`os%KIp- diff --git a/docs/_static/fonts/overpass-mono-regular.woff2 b/docs/_static/fonts/overpass-mono-regular.woff2 deleted file mode 100644 index 280570a46adcfdb48ea30406090fb0e3a4673509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20532 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 H`Gw0BF8zcF diff --git a/docs/_static/fonts/overpass-mono/overpass-mono-bold.otf b/docs/_static/fonts/overpass-mono/overpass-mono-bold.otf deleted file mode 100644 index f8291d926d984f94367ac8d9edfdf2b4c728432f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95240 zcmdqKcYGAp`UgC-HQ7lvby0}PPDCOqCD~*XiiK1Nh6Ix!MMO8rCRs?bVRw@dL_|=; zh9DM-g5BL#8HN&!2d-nwD*C&wU(iBxFx&> zSeiVI-kF~cO%sGTT;}C9`-7pAHw(i-?;JG9f-q7reu|pNQF_TIE!V|d`kP=heuEa_ z-MW5tdim#@f6X@SGo_)gQ7}-eAQfLxF)n5s(dB z22g)}EcGRf0+NAq0Gfk%pi+l^U5mEzu=dmM>-|U;eF5T&=8Og|0O&roy#!nV>;!aL zn@}GKkjyH9T;NKe4Imn+EdbmHP#=gb3ZQ##AO;}$kY1?$9)RRd zWd%Sq5_I~BFP&DR>1?36iN0_UeZ>290M&Kch`w-8dpL-8((QPF=%Mk;0n#DqCRT$9 zCF$=0fb1m#AlZ=a$i_&{w*n#HTp%8xb!jcKE$VwCaH$6B6VAJYYZ^nkFav&|88{5+ zHgg&3B*#kx;ja%-rUGQkkD1;S+6br9I8QxCwkv&pLb5MDeRuX+Q53Ngb9uDYopmLISU89x6KeZEotc09v0cyVw7y^*q z%e8Bon{?m>NLQr*wNW|Yv}>J?@DhBVd>j4J0bMp^N5sSFCD{YnA+^&SnOaGHN7pWZ ze1d#ZFG()b!rEw#WdP}s{FBNefX31_*#XhDs#1FG& zt)%h#dQ`p+EC#LxNKZ!q@}rwz`*#9&p?(7}7_b4PFS56D0kXrizrjTqdmHYN4Xy?# zC#(m^kM0LHY1f;zHfsN0`&FZFFQB(p>enfB4Vxjmpf|H|8w=u18yKDHg#lK~�mw&4 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 z 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 diff --git a/docs/_static/fonts/overpass-mono/overpass-mono-regular.otf b/docs/_static/fonts/overpass-mono/overpass-mono-regular.otf deleted file mode 100644 index 80a4b839b76cf53992e7fdf51428d0194b48bf46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94520 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 z 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 PABx=cLXOA&yR`os%KIp- diff --git a/docs/_static/fonts/overpass-regular.otf b/docs/_static/fonts/overpass-regular.otf deleted file mode 100644 index 3a7c095fab33942b0597fcbd57fbfec815c9a2c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69808 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 D3Nx>f diff --git a/docs/_static/fonts/overpass-regular.woff2 b/docs/_static/fonts/overpass-regular.woff2 deleted file mode 100644 index f8133b0e93b133773ebac59b65d51e03dd620082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38728 zcmV(_K-9l?Pew8T0RR910GCJr5&!@I0aY*n0G8SS0RR9100000000000000000000 z0000QiZ~mA@B|!_RzFBqK~jhq24Fu^R6$gMH~@tfFMbgS3W1SG_C5=QQ~)r6(_#TO z0we>8Bm^J@iEamr4_g>SaRJq9cO!7y0D@QRgX@kgV7D^s%>*)k$vjoSjiKA^07Rw! zrKSJ>PfR9qSg!1nBy9^YZ!Z)jn5la}){F!;ckv{LXgD<&u_Xp7l;5b;{)rbTH$eJD7tRzMu;3 zkGg~UqwcdUeB~|Nv#_ApAR?qztn&PT$nv8)b;p61!ZY_d;rJaJ`se+B>M}4kMp{22 zYMpp~EA;>W-PeD_T)Fe0s(oSW>pqC%A9m-@^K<)i?u%`235;IR1IHNQ2xn1F88yei zSww$C<!0s)zx4YahFU5{WQmkV zr$kCq-asgkN1W1xP$F8ltUa;$$DG!;@gZbc7V<}yWm%Sm5VDYkZG>ZtVvIuwAx8;0 zODWCJgkhK~J+@141nHb-=FVK%%yDPCnJe2#kBebbUWU!fFf79|l*drUr7jR-%v?sToRls6N0tQ?HpII!OEYXzvjnrts}3Ia?EUn*^?znEggAr{5CM^8 z)m1E8p0~7pt<|qy7}$NKwY~MLc5iE2-R^U>BVvqU2$RWV{#nlNuc@_~TE}{Pwx?rv z$8qd(9NV|-&a&+N%eq(7zwUj@=DhFs`F6+Wu) zI@AkMUNCERV}S}dX-7gqiMu9a@}X##zE^y<4Jjy_T;(CFwTmA5hl`URB&r9i(xUt|g?P!=c)1pn}Q zU-!c^eoHFJ0IaqG%XJNwzut;ej{kN4JMH8CVwp$HJNLIM620*-Y6ALlKyg4}7==xj zh_z8MMCq1bDM1Woi{*mKGwi=0r*H7!n&a})vH`Wg|A58`vWZ2tMd{~uv1q9B6u$r6 za4Zlgbf%iAa7lWf&ionSc}5VwG<}*rsaLx;9|#Qjz*_AmwQ?I|7+U9`XIzQ92P3=& zr3dJL@6WXTXYamP-+c2;^t1UhQgAmengC!&WitKlleF^N>t|bLS-S!LUXx5LFv;P{ zG<^sFd_tQN`3QY!Ko03<0*|LVKR zsY)pYCFZ1|1cu>{DDhL@J@3i6>_9PtQ;S}J9`11RQMuAibIi5971vU(7)xf zsrLs?S?*A4WVI|0q~%b{a>yYsIf$p#ea~5)LDtDVG`FvyprDfi0s;aG?g=ocCTlV< zFffQFYYGVH9t)kK?u8I8n8zP1Y~dnW-7{?2@+X`A9yCquRc4tO$MG4ajkb{$bH#sy2)LQFn3NCS9r6E&5eiqp*MS{?>p)P!VXOcl zh?o&+{mF8kte{{OKMoMUT3QY>h{Hv)Q9KV};v`vS6ugGf^>Bt99*@WQ1YAPQWu#n5 z$<;LMRB7hIYp7#nb#0`7&Zp1(3iH#tVeChk(?o0|*{is20PKFpyh-&`{Zd zh2WF5j{=wvSPHNT1Py{Pr%DmPVeA@s09)WVN7-|3#b4n^cb-iATNMChj(^6j;}m&|9J1Mo+95vl}{6&*At0^jcz3Iq>r)iA)JqE zlBTy|Mbf0;{NViX{F(WY`O*2y^H=9T|M87aWf?B^ zEetMB7<%zrMOW@y~O4wIBQPhgqssYk5CUtn{OPn|~|L=?puHqi!8??e4$JJzd?cyR^%? zoGZDqt9Z*^=SiOGXAc;!AWJI*3z1iYNtQNF<%Q`Oku-x4igd@weiVCy1Uz;TsNc zf-?jID^$>iB!p0aGCRZGY>B%#&RpSIj^h$siZi&Z5NlE!F3UHy&$Q3AFSMMzj%;XJ zs`N}Z;V2}9XH-|uo()?d2oC2XNpvGpM$?fh`gNp%RvT>6pvhs!^*|5; zAa%Dv3PM0&@mn*n?H9QC$HB2{1|)Y6$etURISwEF3C(}QNB<6-UWL{F!=eRN-+(hu zfg2>DL0E>>Xh1VQMThgZ>#)K2>&36}&g4$y*iw$C)U0YLi z^?7xwvw93VeeY2O@FDo{2MFLJ8sLzz(_f9;nXm89!(7hj{0KSiwI<+ zq>>9E3_wnaJmslP6Ubv}OK18r1oFislT9&|Gzw5tfLfwBpw_8G8P!n~Kpj_wfV!x3 zWiEYLfa6!n%^$2a{%WQ9dsTY)Pu1-Hb|;~|I-yg$B+%{B;ou`WUi;4JO1tW=p^a^A zM|(l{(T*5@v)gRnkGh?%-nAQW?mJpg%!qZw&(^EdfpkgO=L-9@}8O2mKczw*_@XW2WBBfkBcDsbeh+5*Fie(JY z!by3Y%5xM9COdnb$EZnm--`)qqG6)6ZxD&uZu~#@#o|RpDI_Gt8$=zc3KyH^f9cB9G{%4;G2WtgP08Q=^s2j z`3h->)7FRguP*-&mA{zL<=}E$0QKI!&HFV$MZB;pIKQi)rhbz6Kaj-#TsK5*(Ms>j z*jbuxwFdq>k>MD%*Q)nH>hbg1=jh_sU4CSR=(U zvS?u`>7Yp$<6U2bASV8W>SmqRX&>kOYhzWsQb_Y^V*5Oe4|_rW!rSmPWOcoEa;H@7 zgDY_C&#_^EvAEKH@U7vF#*A9{x@a~;^GS(g^@oZb`g~<8r+*Lc6@TdTvCU_kyDhp?Rs7d2L@BE4VSOLI-Pu6nyu>I6M! zkG&m`HDaf-g$I}Po6yLAf5m1hjo$e5mIo}<{N;a+{-Tu&e1YhPQwUeFQoHP_C`}Gfd-%0(#CzPTnD;AL~)BB?Y1BKhJanZ-SNT>fq zjotwK040cnk^h+VeKG*FGZ(Wx7Ph#Lj{!#86Z#TEbCm%)47MrArzA^`+@Aa@m>6;= z+UfzN$?-_s!Sctr29}G?1@C@c2%i~jLpL%;BV>kHgsr&~3DJw;2OK8>DLAY+jc6w@ z%;R8|2?Amse~+KQN44o*QOw0O2SW-KeV@Y#Nen?ZB~xl{Xh=UZ4xz{^K3hb>NHzP29ntl-Oe)(fg_REZ!LsQbm$mW zS=3e#SPG#%%2!SVA)hiikCtQwzGjbtS%pN`#0tL}dTLkE>ZYeyBbamqplgDKJlzm! zE#hCIl;Dv*9%s)kiZbd9qhV_43R3u5_a zPBl4U`|xuKK2F|brIr}@jG5ePz`)|&deYFaP|_q6PTF_6w>!C)>EHwR?<{8}7fI(= zu)FH#9?N$tO;a~ahqfw3CK0Hf>#s-D082m$>=?H+252e$yzI3;vJpAI@=lcD3eo{) z%Dw;Hg9??3ZSj0G##495QOxIZAyOV|RAwNNA`GQ9*o2hjiVA8-&oM5w?K(uZTuQkAsKx2Im&WMum8 z0BcF2Xo!w{>1ZSQ%Ywi_)+yPR4_podGqDJH!M5lL+`(vxpM??xY!^|(qvtamr)p#z z3M3+>c&8yKG{WUB;PaLew+Q~#16_gzyDVY?0oREi08!0~|H`|Yv27>KN-6tC<&~sp zF^z_eXwa3Ckt~0U%+bv))x9E3N}K_v;uY~uKFJ!13mb$Z9<Gz!LjG(k(LHLudPAn?u-a1m0& z1?62hT&S^1cZE|0k3!Y_iIU{Kh|*S{67>=_6o@%?RMc(JMcIKc>eD{RY87-9Q^A`0 zwBK&J)!t*W>9&`nJ`4;Vq92o0b;Sn|J^}e$-v$H46>9%L>`{YIjTDA_JFYlr+8ZeY zmGG8EKs=i*p(4hA!G9UQ-UmiA!r$fBOK^=PfR=`0ls;0w4g;cgk|o+AeUlhZBaeeq z&1IYEd8cX8WJ99`OS*5uk>t3#7JiX(O#!7q)jhBt7ZG!L;^Z1UjgT_hN6vf|dLcT? zJtJcHDqlPztB=wULI4X@;EFZnb8VZ0t@lf*BH@ZROkx%uAABBZ;{9+{|OuMfYy-)l8bzFk)n6k!GsKrrs~b zI|b;DgHpuQW(I}_8=>h?m_d77XmwpT z8OKOf9(r0C(N7uv>?k#M)&rpE(>T>@6jk7Zsk!Sk2)&sADKj^9>uV1Q;^K3q1}-(@ zC_~&os%t{7s((U229wZEFVt6e+yb^9Pcel1>M6bs=_opQNtX^!&68Z9UpNbp*{MJ5 z5pfHI(#c-Hsf(l!PiMJ+s@&Wd){yJIlW$Ha)bIOJjl@*ZR}=(vc;Lo$LkSH=f5BZg zvH^8ug@MXBYw%VyjSYWkd%-R7dmLy0*?5yko$3wDCL;0G@r2AKltz~>0HKs2h*7Ce z3BqE=$LEM)+1-t$rXnrTpS=;Gn4(_5P2n{S^Wk$f08jv#q|Z1o#7cBR&iUM_@=@f$ zLg|^YK8(Ooli(}62mzDfMKs=I!;Pl1Vz^uU+H@-_V3~LEfK!_gvLVI*QU(n77QkXQ zY8xW%O{ho1tTsBb)^M@F#0A$J5gs)9mQCyX8(2|%XuuB3_=IeXTWbX0k3@qcT4YJ+ z6cxx)NbZE#1DH;?6^m&MDNY8d_cT0NurPycHzOZrC9}wZH(W_d2WZ^Nb&joZq(6IV zM@^y?>$f}Sir%^;Gtr#oep!Yty;Bn>mEslG1IsJV0COaZG#7XpH}C;=2h+gw15#RP zx+iAhOm-wMSalgFYu$7sUhpCJ`Mh5>i7z;)8L@5V4!2pCa80)-UHZfK^SoJA>dmk(62=pp)>aqC9wY zI*fssI^2KMs|v&38c=58k&;94WY9W0DV{l;?w$i-M9ncP-7+>D+RWcvza+j_MDdz) zDxqg`c`26;gj$QkJ215*dqGjOQ(@cJP6UJ4;fLXB_X#-N{m9TYO|ey6)OwWf{?&tm z#fxbcBioyUH;vHS9{G?hL!c2wBgKV?W{7u_=iPs2vQBi7*tOMETtfyJv(=}(y*xBm zDk}EDOTvV+2&$1O9TZkqihE40M-v%_e>?!o98{c;pMnxhXEmaMUMvU> z^b#HztlY}hgJ~_HKEaq6HcL`;qxAGj`cHysR~xR~*LeUss>Wo`Wf`?3@w;Z+ zYR#)Etvd~qA_Bc&{MqeUYJH}zig-9Bn%xjZwNm{>RT?!Iv|f`Y(CA;948i|`98+6u zJ6TreriNY)4(^s^KRCuQoHqwAv3`mzZN>C<;OGC&a45+u3g551ZVPnp8#qm!?nuospvS!<05OH@ zgp5=AXYt?+pYV%l;XLZV;>WfJYpue3{!!=IeP(K4$bfgoKnoa{7L}MjaE+BetHJf- z!xwPXc!|!wrkavx&jH^KG*(k`;fGA4mz~UK4al2DPW08qB|rc=r_P@a*SSyx2;mRV zs=1|pkb`4@3YfjktWqC9pFy1T7!dF>I@7@lGZN=qKjT4nuLaUERUPt5*#N`>i@`1b zI%w?nFt33nif4G-^k)q=eLPP^9Lp+)1iXkvU}ujtzRg2c=p0rP^G}7>^rKrDOt=tD zvrSWjk_5u+cpAji7skmn-9Qi1ErKq3pwSF1Mg zZ9uG^F|MrYDbNLB<{kO9^z~3DGd~5okR=W1j^pn4K1@r#^fz65@$P#%SbSeutg>#G z7H?X=rM{9(rf&EiqvQ8lly;_bf7b;o7yS1@BgQAeE^(JLfI1lmoCfyc{bEbT>AAey zI$VzV_~y?OX+Cb@c;S=o_XiH^_GNGLC+CEn0z}~SjG3ZvQ{Pv9W=|Y|nhe(8 zJGihl;H3D>fIZ?as`e?dzXN+a=Koqpu&4tRv0X5)A1%rtCRhRpV49DQ7_1<>_Zf7D#<35(IVRTorMbo~Q zDQA2?PrN_^UM4*h9gUt*jJxx4ZyP(RKW2xx9Zj0}o&AjP-%rfxoStd z%+wv~*=3sSyzG2s(X-6gn6B-g3wxjMGOve7w#Rzv*>BH>wYbYBSxp?=i~#L%3gNTN zvyLTMgEd);wONOCS&t39apn7)oYvU9=}z8RqKGDj!6zF}v~`r&ji!Xedne$O_b~4T zd$SMwvLE|%00;V@x{HH-ck4-)5uI5O_*6KJ(>a4PIa}v-t-R_p3M}Ae-+LtfYjgga zoe96(f;2u$1~n30!k4;OBvO7Qd=197zGa5gJ4GM>I15JHe& z!+$P-0si4H^oaR7Bw4+xXK{0qm#~)a+%lH{{a9i+US26Didg%I0DAyGA|`$#d@~O` z2`be%H#oe)iz;HZ7=61muOV|BB)jAAfMHUUu#ZS2-X#VzE4(LVE?hFN_|U5&1lmhZ zk~GUYPcWJYZ@UPdwQ_>+=jOG*c4S*}t;PAixuxbO^o?c!U*x0^C|wC3A$Nw8qiN6u zmUDyM_Ky&1@JuvIG*4>FSka+qe2GJ%cB03)z*POc-T{*;heFB*W=ojMOyv}bcdkiX zV7{eTQzU}n*Uk+lJ2qf>S6B!zbB}UHvYC&0#FcCNX-~0^1Ms-zBvC5gSu6_C#J{L& z7BkULa=ud$78OE|i;!TBd~uG%~7)nh*t*I8w?Yd89G{RCa+CoYN@$h3BoSa{mad{((b- z`3fr4K|QrvEoQ!UQh)MVS6#KvO?Rw^&9E`E#gi%x@1dEkda1izzo&M1&W&Eqy31=n z()4PYY4tzS_I^r7x*vrNy&NT1=k*~cfk!NdFE3n; z8Xq=cp%4LX3@w5nBv?ooiiRIT8ekp}8JEEeD1^UZC?FUS1ZE_9DWp--Nc>6@3!y(1 zMKP}Kr2&|QVb2kOeQjZqAlW8l!OGyc4giCbE!_|)kdh4d<$BtQ-CJf2K?jK47O)$z zr7Zz_Nd&AjijP)b6J3^#5{(y5Zz2!hC^ zzU#>lrQ++llXg+A5Dy}RI=_OOK?F5!_%N1onv5Fb#5Z#=eAnl)T{>Ks#$|phLjnfv zj7k|Vl1iL-pVQ*qMJmLsENEv|90BqFeySq*@!Is)plY?uJNAi*Zot^R!U0$Bl8dKY0L+`W~?V3^G);3o6PAaL)x77gb?skD@4n z(g;D>3y?0FF{K9Sm;5Fn=L+T(5FZ%IzcQ;>Nmcg`k#N*w=OanPWDH>#?randN<4=e z2=p++1_wL{d^k}PX3V>7#kwsMfIooS^|%xb7Ir^s(-17_u+m4|e^*Bv#(}$aPBJT)~p^Qc)_yR@Fhd#y&GUNtVUh zOj-Rb*20G!AWr%5Yg@ADU%QMH*&Vv`gi=FEK!-OTnS+Pr@z)Z96 zMtEnVW2jf~qRNL76(d5Dkz&o-fp|0hv}zgG{brHKagLn z(pALSHbDc?M?GY#thNOZGEhOdO0Ui;!L^CR6fC zkj4x%s8*nJ3~>QMqTZz5TAW#&O%!L2>^0aeBxfC4x|%J~$h+drEU?^QW9FZb*-~UF zz&jU!ILdx5dLB+AzmM^^#n5WotN7tO+y16KXsB2<1>#oHO|7UVlkOkv2-!Ffi(=hFb^5 zw4vzofz#Am=0eL#CtK}Nz3oub*_P$bOZF6xj`v)u-JX!tF}moja;{~CGpX1ksncP< z-X(O)5_JvL35u>DB|1TsguDc%hzT)`6n#-6uz8e5MJe&} zD8?mG@C#C!ltdvYLTOqe1y__}W(8%Je%C$(dF8|CFxjhygfFEaWNhyPc+9x zsr*!9dNd{3T$b(6%Cg1T@_cJyR1g&w7jg@=TffA%)Rg$rVYwu$@~A8=HCMUn#d7{m ze#PhycgOE$@0M4aSD96QRatGUJ*#Q8%QaqYqLy7Ntp6*Jby>Z#-q`T-sm7H?ZnN^c zsPszZQo1E-`_-lGgKarsh;kU43B-clFWw@v3^bFn?^}P7;SNM3q2c*k=1IY-!~UcO zf`B~$TC)Z?HUezx9;Q#TL4n`;7a(z9hy#0kk02i6V3}XA{s)35i2VcI8Q?ph4+uX1 zdj$Fl>nmKZfZlmCtRN}e8cq3ld-DHg7EY3{9Ota7y}85wj4TnL>@dPEFTv;rLl zTV<$N8{uE1hlrD5fi!utWtuNbm2#g{s*NE%F2U_KC76Ks#WPH}jHasGCt6H45eh>* zBn@%x9)L?r>#J2393fso1Lf{g_lPOz?qiV~zvLKmV1a(RPb?AiGT~9^iuvP2rK&D; zO=got0x>F1K)lK+9>EwS93O962E`-uM|*!cVX-Eg*ndz^x|+-!H2}B_bk`h44A7S7 zehGMrMdg$B=FNOC1*`&&oIRdc>~NWQ_%JN}-wI$dOMX2Cta-ZK?Bb^KCbj~8-h2qa z5;%Z0kgLxwcOn4JeO*w6o*;4>I&sYC1eA2F5CDZ@ps{!0CKu{ZlOv7m?M>+(YWS z@H6}pJi~Lmz)O51pXS?FajtSO>>vJoc$45NRPTJC126{-g9Od-b9-XfEaGXNz2yYo z{86+44g+8q5-h%;o!8E8W4126Ixn`1Hvr&A-^CX3+N+~t<*WEt)|XFSF36|6_-XbX zuFznI=wo~he4zlmZXXJh@Nexey5~Ec{<8;u*WC9H1Mr;y{=?4>@C%E472ktC zzdFS4ehdd343=*AiAV8c_FL?0#~gOtLo5UuJ`6krh;Sq0!j&&C-h4>#7a~xQP{CmX zt-+#1i;+NQ3Yc`mB+4`r5*iT>9sv^#U9N0=g@g)7h{6R*lqpuCl#Wc5P-VXLrMEuw zxpxp?J^~^qfE$w{P^ia%_)t76f&!>wr$_+!YV69>g-U{IGX`bcS2wgNpgRuZ=2Wu> zc1-FcfmBZ*eXK&J-L7P-JIo^#aeCg5!6aFDDOQ+GXfHtx3DAM;gwsl<2NaMcrNja+ zuQgBg5|ThF0*m1|nxxD$x6w4Egz>6mYg3@~j8&1vsiw<8K0le6P9zS6!o_)|f|gep zE-aaPQ&KK$+ek$(5=n8FXS&K3wVgUox~Ni+N7vr;FlAVTjVFeUKSkT3T&GKB? zFO_M{d zVpNe2i*qAxeTz*`Q_ozFG+w*PtX25Fa8rzmA?vS#*BaJ2Z}J!`4v%EXY#5`CcCoa& z3f?%z%_dDlz$j|$^PQ))kNxs-5Mn5ZQ(@0_hf}#cE)B(Uq_MBHth&Y~iK>v%;;H>U za#xcGQt~#5z*O+5%YwY;)3;=YcwdGGciO~2!VxZn(kC3BMu;-h5FkPIYZo-i6?3=?hmDBiY>8Y?(i zE;mxRuG51^7{dSAegt-6mo>SO)0d`J8nP=+#0>fD#VDQo7pGlS$NKO~G3aU^sdgf4 z)6TS=BmeG6pbuZiui1AGD7bBpnSWQ^;$NrQHD`9#z;=O@Zk4H9gxxI_E|sG!5AdvX z#p3I&tHb+QyI2b?w3m0W(A+bFl*v~YkIu@h^F}(y4e@XFf)Nuhgghp2+!BjWofZCb zIm;f@@upha8k3j3ypGEIFsB?-Vi4H>{ZQ~X$DHWq+7~G)f0JgZ#uSk>3^tQ zzfk_LLZiHb(<#k_mkmuKXieTozl5Z zXy2lp%?jcc7U=TYJ`Q4id_hsBX^dyx4C}`kOa^RU>)&HkM^`R28YSconY-p>xWRN= zSq$Xp>|jLPh~OsY3xiA3v#gIUu6Ve!LH;_FL?~soYI zb5TO2lO>cYz|M*XIvCwJ(e>42nrYJ3GOp<=tFH`;flDN6*RCsc2^XrGJ$WvZ`+kAJ ztRaNK+XDo20E6b2`-?HaIXlryA!mDKwO-xC%=7vo1mZOBQD+Zg#Ov-}At$UKxyELE zVK$7^rQOn^W#e8NQgnKSCia-{IrrqA5L;N6j?aBho8dAs%E57)j*r#_JiAigIhk5M zA>-=PoZBSMKll6vwMb7NZT!e)YtX6iUiO%W78A3K>;BBo+?MY1kucqnTY=)DM99?e z`=f=)n|+oKBieGvO+5ePN@XI-zbBQFv@uD>8H6$kk;vOfDZ)M}?&3}uVnO>+Kj@4@ zlQCQd#$$a9fz)=_dL5BX8W-pC8R+bVy3ykB?s@KciuJvh(eu}SbL`q_`=y$1eME@0 zSIfc%wZjB+<=|Kn>TuRs6n61DbrPSE{v6G@;yKDKF#BVU$?!uHgT&Coj)f3td1)6z z6I9U(t~~wPh38wfu=6z?}RR&lBE6#kUjMiBFBbX8xMQrVuV-|mNCGrH6x%XVSU-h7fHGqT9% z;g~(LOP4SPa*T}K*LrIw&B3l3z2(rb9{cQ-_6jy*buKal=G5v*P*OcAHIXF0*87kp zJY`<2ymy34$u~+}E@RF2uUvrBf2_lM)wV&%kSE2v>QS;1C}ZCx8F=@hY_SM-R6&*e zA#O3Nw1p_LXUbRzd0U>kG>MMiYE3eH=UNVe|I;|8V(1%i*PP7`j7i4?61;EnC%bOj z99n(GF}AJAB3D_Fq?yPsOHx-QyD+16V3hKUD*WwN)L<$!@bfRfm8bq}ja$Y?4@2ny zwhcZeAo;u+V@KGY<2g?$PrGLP#1N((Ote<&4a-pzV#?w_$T?Z^Vk5RRt8jL%qu70} zE!!EsOtdMfP2)oqe5yn(x8*JM;9OUBbfz;sVrlHNjm53%m5R%??Hz=ZH?vN5q#AdA z%=Q%I;w%&fs$^@9+{sGq3N2$@d|l@4(Z-%LKZL|@T%V_^eeHBdtO?}z&J7m#KZQTL zYbalOM_i~_E0dFJP@5C8m;NEQ)n6PuMNI6qHvsgs#j=3JOA@n}e!aDVYpYTUV~^3e8x;4T^={6yA~x^ow8hU0jPX zR1Y#Z#=Il-?$9MW2Zb6M^*;7N$O>R|*-~<7_Q&uaeP`$aE7f+DIDTjWiFy#7BAMfr zx#1PL2UoA2a1pKjB^v%@tq7u`e*NaG48}RBA_ESiJShx@P!Q{5Wq&(DHKC&s(2>y4 z5op9H*ctO&_hu%@!I)uuPO|^U`1DHd_Mgqi`)Ws*07qY-uk9D*pP!dO6GZ&hLJz5-RIi~#OJ#=kH$KFU~AZ-oKd z@g>f0?T?fA4+pf6b+vlV4gKJn2aIGG7vPSvoY$DgO=ZSB?#i{j1Dvlsy4#rrU9R z=J@B!_KQy#+{}pM+{`&M_yjWkjjrth!pYWzUeo#DEB&x}F-uddKERGd)l14N#tQkf zAu9r9}dazH8539{cf~-Ci%U z%g*l?y}WVdV{cENm!JAv)7OqY*}1@_PtUQy@`!PKar zyo^x7uJen+);&4O2Lq7C+f-?mcT0iCvP)*;{(}pbY`1fyXs=eLs}{}1!=Ok}*ED^l z6`o-4#W4KtX~MON5U1;oe2~d58>?&ab-rNFg_c20{Xkt^+8f*ZPmOa3wfE$f4`+fM z*)!Rn)9p@M9+!BfPNQT&Uw(N+8Hid3$?z4vH0-8eVwBhME%sTsuBTm=W=C}^42N(A zdCdD-Q8_WXA}ukzvMfiYmFvO{@@&vU@Qr(J5yJlI3E|q;7D{7PjI#{BIBER|QigoQ zT_&Jq2fjTSPT0Kp{yqzv-+`v3{ZK47gY_Sz;Q7mClv5%aY@(y891Ih~I@>m2GWnj^vzsm5&6}q?&%I3}xWk*>pSB&VSQ@iJcw_&%A;wAwwuAc+ z`^D1}Mfn4Va?0`MfX?hng}M|w5|50G?jppjBneKPJagJU!#mTL7C(S#&f*`9H0@3; zHWe~iWnyq2BAp;`21_dxeTUJ7DC@4L*#@P&B= zo)G#euNDWkLaY~!;#c;$qSedBM(gRSkh1AiA9z6)s@iht)N#`#9Z^a4#!SZVskzn& zHbbsF3HWnHvUM?{P4l>#q7BTXCKZva8S4OFOU4Gr7S!ccvelTx9WR&JS!(#3E`l8p9)6&(8W)ra?>0P?xi7I)fQnQp68jh$Yli&9>6EYjy zFP$ny%~j_CJ8+>NCU1#=Sz+}02^HpE2f-oN$$LsFv{s86%)fEGaq*skzJf+(z;+{% zm(bOhQ+UMNh{!j0`B#wPDCmRa!v`Ts zWnL#}>EWubc>W`I?}gtkr^@;cJOFK1jb3@X1N$3?;9PTBF1wSoA02@iCh}&l-Z?zx zP#Wbn5uyN@pr=Y4N{ggHEU9SIt8=ek8UeFp+k^+*H~uYlj3B^6t-mf6l5_ z@0eR!?--S; z0M{3XssG*6!2|`$AC#|NtgR7MVLGN(?-B>hwLYk+a;BUDqT!vdmDMRE%f<9>54(8v zoXLc%jeE&(02kQ!U4#K0i~4Xs(vU^ccHLiCYPy8=-$)yRhp!2--J{Yi_YKL8kTP(UqC8;(nUfYDD|f{j5W zqN(wo2X6|zffRE7)K@P_4yn1sCa=)eo0X0?j)G146mSY6dUN#WgH3Pc`qieN4mu#B zH-IV=y;(ePSYc1Xeki|mxbxECnh!bH0oBmq#Vw*YBWLs5ys$MYPi))id_c(YO#SZa zY4yh9?jj`cg@;#gLu=$q*yUBL-g@d_1iF*CD8YR321t zDx{JYG?JEH6CGwtElJokhLl1=Bk4PMu}BsPJPvf+fBxv<{g;lT_g_AIbpQF0K4r;3 zQ)@||Qc}^^+Eg(BOpvwo!xKEr2Y~Bd=%E z$0y-=-+bLV-cY6+thW`;a5N2ikz4(}IfalvMGGqq*PS#N z^cO!-f;ZfIQmANY#&~1o2Dk6em(3u{v*c)m0qt2-FXSd0b~6fxXv{Vi3vD&x7@{^* z>!DQYwI8SG@w0iuvAMQeRjRwy^>v?rZvlCp+GA90Ps&Q!$47Ly^)Dlb4Ld(;A9=j9 z?&@epQPm}_`es#q)q{5{8m5_6G`23+GC5*p)T8kxW-hU=9u0W-j5@N^+<)uLlzz-I zFh|J8?TG+$LFn21p1Sg~-qLVM8s17~2CFi~MKh;`x~en6q8V{!u!_uFR6y&OE&9sK z@2dbMK-#~Xr|A|1-jIvO)>`lkh8dq-i_gUw%m~_fnNiCWS;{4amU0oZRtxexr*z)$ zn!DbIbaaoP6#A>B#W!lLhWj5@*v22Ui+&q^F>6VC>(SebV*buzgLA-ew?vwH=MN^+A$GC*ZGY)vBylDImqIum$m&sMyGl zOs8@4(I^}ZlR}6Vl|@HhxzmsXx%3{+b3aRuht&{F4m&7w6Vx&@`nWdrvj@W+K1Pnm zv>`}7hxZQCbPkl0(bXnQjwv;VkeNj$WFUw{1cHnQ%TLWzL2FY(xD`X?or%A=?I;dZ zxS1z=v=p48tuj70LDE)NT+&=8iH%`3)?ig6?O2bw22LR(Qpt1#j7CpI(8(DG59RB&kfsDBJ>KQpMCicN--2??p( zTn;g=o+BM^>*OV+JS@!TaFx!)#@XRk_C>a)5f35K(o#tXi3*V3iP?ncSYZ+qu!Pv? zXpHkm$6ktrq|2`>_}!GuJazO`Ds$I?(uC6;OR2d@_r4{U!u}MXda3p6D+-sUwd4!m zc|Tv1$E~Z;HTL!z7EHz0?ka7z3u57-f|;nxWq)*X@gYXZ@u7JpzCJMjcG%8~1r7}@ zzKq8B=mwbxkL}jyX00OsGx*KBkg0(+3Q+Q>)XfX5#(8u zfZj3DNxOeB(#W94Ip1k8gZx+QoJx(W+k?e>^m@S2a;EadXU|VK_iLOr9Y+0dfsVIj zEq(n02q?+dA$Jx%xty~v4&+e%>b2?)lWrtm$KJ3W*|SFk+a|{9t%=Cv)ZnCkMoU7R zE#sI@N%N9rdi8o`W-FQM=bt_YJ~*$YOC)3+SyQMK z4F)((;MM`RYgRhJC-QCN|5xwYBgR|yEMFpsUp%A3u1Ua0%)Kgt`NrG8$ZXC$w@p?$P z%^Y3#OflLedH?p}{dOl})QR}KHL-7Ovvl?ok#LeWO3T0`8`LPXjW2644t>LlDO4j! z1f0u~Nq6oBBg(fZcb93|#JA0IplWceVEmSv;n$1WimX z3nijtJ5y0+rB>XTPgzl*{*a$6mu|8R5E~5jMiAYDV))d&~T2b;-iHWa)%l3|CkzwkK2KE4*eD+CHg&I^P8EVUETfj?s9_pb>@}VkDgSctG|8( zyr-K4BW&)FpgM)HEvT&MAUWu<|iuPwE0 zyEVJ7bUHPdJ5yY&Z_}1ha#byO@-DP*E3Ax@W#-l%yFBSNadfKEW5n#6Hy+*KYvDipA_W}0*?4otcJuiDpZ5PWE1yVOCF?Fl%A?Xt3!fe<$H4W88R@#n zyg?8PNxeQlFCW?Hue7a-jA?pGpaCa0AlR&`bX-wT4J;+VfR*bJY+DLGZEryeY_E`z zn4E@B*gw+siapj9ooMQ98>CDU-b2?{q|$y(Hu}6PTA5DOuA4{st2DlcSNU9&%uKwJAf#jt!;ke_-HUft&m_n*-IW0sgN%-jn*p#=+d7!zfw# zI<;71v?%3pBn}b#A~N)YPe=$R4FonU7CI@&K~7p<;lA>tT;1hEQl>85#7jP)gzmJ8&Oj0mvQ}Tmgg0VQ`pK zk)G*ML~2dAyz%zUtP35Dh#CqFJsTBq5d=K5C-HWhqY&G7@8yPb@WBd35;{e&rzZfu zJzyVc;n#RMBN^oM!SeThCPXg#?hHQ}x(^i_>67*CpPC^_ysV-?lF71`fWT)CeqK7s zjPY*bGtbkl!7n3`9bkr|ckJQG+`zIxI#Up^N#UtpzGR@``Uu3`Pk%Rb9)~Z zY!V1|T~F>tHsvVdkkD6p3SgxbYzK)%aw;hyN=i-ee6%;@F9q_vvG?%Rm4ZL$c@Af- zq862{-)>RA4Va?KHef&KeJWt}VQ%axa1?Q~kz1jsR3x>kNXk}6cB0$HZ$#Z>TGxx; z$2a!oRBsPX4(qkrK?U+{l&9b{rFcr3?dWv+UyY^PNPP|~Fd^4d_n!;auiyuFgG+A(m;DGXzY<*WlCPAq zDo;kx0As77ZPm7E+qE6qPOVYfr8Sl8PU);`bhPblJJRg06JfvB005bt*+ydx`OYMU zwpUJ$1D&}U-$wh`RX07fBPTny2S{&!N68!S%yfF=o!yrb+F9B74#YsddX-RP2I4zu zf4_2h;*EEeh{jFn-=9WJwVDnJxI1>Wi&oAW4R&W9$n2s`U%#OTfb{UlDZRg(oqo<2 z4%r<-=1t1*W4!($2>-`GNT(&-g)ei@0=i#~_zRW9*@Y259E0U2$@a}Lx@yKI(M53^ z%KnY{baHry`n=leJz(uIpabxw-Eq52d?WLVsg&10ks2@1$`w6Ef0-7lNdc^YZf)AbZoO^5Xsv$aegd8+REh6|b{0&T7Kxv~9w>DRwDj!s?A zp#Bvu*k#5uXJfkCMP|8h8fO2VQDHXcLAM!m9JFf*qDJ|78JwTjj>)8Q8gkKs1pJ+OS9CIO?Y)UbsDUlk9^e;q87wO-P)R~5E6u$78wSm_z zm$YuZ+;d9n%_bxcLuVK>>2#*Ni7VJsrx_DjT6H#_#2n)@ok?C2<>l7cGsX`T3VQ-_ zUFIQx5FqFLkCt5UH+0r9nTmnUR-eW`!w&jxMzT9k=0^UL_eG-QB~-dDl)obNO>Na~ zedq+;o=(Hb&ie}RH#-sRpq$Bbmo{q`e1^P7FR zRmS(?FT`Je^zl*6(V*pj`xZZdrFMG0dThn|pVrNOr%e&Hgic(rU27k!dg#RS10-1l z%wy2g)pM9(Ay4d z`yb*DF+iU9xcjX1`PSzNt%R7FohNVT;YXh3%+-bZD^TzIss8#Q7g^jKXz)=`iG_32 z(nyqUhRLGQmW$iKJD ze2A>w*Lu2jr1cXk{=VYA6-Ue2XWGAhzj6Pg;GE#A!M}&3gpfmuLyRH4A>V|uLf;Fc zhusZ#3U>_;4^Iy-2%igI4*xv-FQ^Zc4=sasKyO8eBBmm~iG)UqBX30Qt2GLvN~26s zgHbeG&wn%+|6t$MEuBf%#lgg`#K*Uun_Rv2SD^F$e9&obyGLprZYID$0Uh86061+# z-n`+r^F>$CCUfwFa&CSc5YEmMjcoj8-6yYS|9F3Pc{60|B=O})%ce6T%sMZcyLnmNsCTxS~^b)YvN}?tw;bfj%#q6;&QcglI2Kn%L%tAq=2PH0vG0j2C0jK*@X3 zrp4H}yjpz+bbNmRfEL(4bR9dUs;O=GJDpyt8@zK28wf0+M?0WgCnpo%tV5ly1A5|{ z(%c3Cve;5!p<7J|qaBaYsxpN%eK=PkNRq`rCveQgYFQMgU~NfNkG&>^7QF(a?fm99os}RM}K=c(>!XTYDLI3|C$0fOve4wmFV1OSTto zQ_%}91_IVo zs3*&Gc%l-jBsBqjXi-525(Jc;}(R=$ldH2!mCY(aDL1uc9x&x#Q~`j07>=X$;WwHuLmWHi^JmLEh5J6*J_pa%ArWK1cGR*XQhRabhl-1fuai$J<@(xpO#afMxQ=$?lpi6A%_ zSBSomzS59;ssHoF#hS+47sBt4oL_GecnSp`91+2~C1`r#*J@Wk|G_jHxIX#KrWd_g z43iS{*=OrxfRav_#o0CPEsH=P+BryFSo1cRJ;#rv_)0;?d`7F!fSY*cJ2c$AMX|yk z)V{@6H|fCjNmDcVv$9|AYGnHo9D#d<@S1P4Lb(P!$~qRl(IO(;T1u}*Vf!`z=-JOj-)nNT5ApV#Mr_)s|6dftqo8?$E#QLKKNWbtC_~IUStyA z$|*obG?c6-?gf}?)8`MJs<7?^s$Q@s`cL*JvxzRID2zsa(#a=%17Ord(%9>Pftdjn zqd6kcnjnSbHX0`_I4qFNEH(r{jJYuq=2^vAHo2(=-u8g6fsCZjah}Nx<0x930g5S) zz4tFYRyQ{MbE3o8`{tYm?xoIIql4f?3X;P(D;K%&F_Fr(~ zBD&AGTgl40yiNT2X$q30$9m+G+)LCHRXb-DFko`GIF8i(qyFMS1Ko|gMwb#P41g_o zB-hoSCI7JBJZPrZKR^rK0s!#Q^v`WJgw-286&&|=+>FOGGz;;#N!-gc@OORNS)!$5h{rz-8oK7V%xSKZyER&W3@q%TyWmt4C`e*%3zvZv_ zbM3jhrHy1|)*$SG9wD;Uk>!L^anRyQn`?+_ZBw#PPLNH3I_NBH_*(ak0+8`i{vkyj z*1=HfuoP|~rx#Sx?<#VUXD;VhR5``;eCV;1>4D9c!?VX+R*`dwhQ=Xlp0IqSMLdKz z_}tV3*S*zUwM1X=+R=#UqrP6Y$40t$nHFB785i=s|K+FC~=f-XcMSR~E@^ofLN=>SGcG z>eb^StUACFe_2;z*~a?JbO-jf4g52WqJ*5Xobw>@@+Ms@x(Df70>IWYi#MH(1(JGA zztQiF%V*{6iO97cydE3N)(N-|OrfFFoev4+5@uYoU*NbG65&LaXta&ia+xX}9UW<% zjMqrx@Obo)8Zh-}b|Nt?VPr{~9#@vg9}Iw3Upu;fa=i?M2fXF72JL5AudfJFwZ)xQ zIX;Fh5Xn=Un-&;s=YcOcnigB|It0vicgl{;MD_7a?n1A-=K78#m;HhR4!m2e~$S82=WzFnzAE~v29 zvIFY|HB*5JmSsj;#^`=YRWE&x7;owj6rOP?eY9&ETQ<{fi(VLk z+fw@kZzf0wwH8E&HzR|=QV86+D~f*bi;VvQsC4?nO@O=M!SNFkLs{IyH*6Kfcq^TY zyH-2>p5aMJNvZmC<*MBkv#%=M6Y#;8!;k#L$z}H^`lX(B+HPv{;C)7cBy%8DVRT{ zQ+*V00L|Rrx0S%SvbZ6jICfV>!>3LI-6dNYELMG=Ll6ew0W`kWQ4odKsFE441j|!| zmlY)32du3%Br#lN@%b19BY9P%){d|uV9}G`HL!3{xqjJ7E1K32Q{}LSIgAX{yJcz^ z7hUTadV4F)2xX_frR?!I;*)`4!Ez3^X+vCU0^RcYR~9jtWofnZF$<9;;RBRkfCd&H)`< z1mD@trh!R;`?;D4^kYhP3;+EBnbznMuT~%iP24wMr^O;ylp%>R`p9+sTH6RfrVd)F z$OMH*jI^B&8_igoV5{1EE3F(x$Ui|DYz@`3a|GIazgs`Q zV4nVY>Tc5GHSBBO-uEX%1urXG2?UHqiUd4#0Y;56Qq1sslZ;O9T+ zdI4JpqS??3y|#+xWPWyS}|3uNN(c324S1s93w?_gPPAL1Dj!7C9U3 z3vG}+s2{YC#(@P0Q&XifNi!>vHtISqhmF^+;-04YIinpdNbwTdIPxi4JKe zTqmWy?HT&&%efhANhPHrt;%N?lxb967&B$PIt}JOO#4ZrSd#`(TwZ#9hJ`OU1=}>f zaM5TuOvjzeqqFag?r(^NPpM6CABFpWt^nD3q{hOIWk%ft~l z)+7&Fu@esov~;81+G0q>L~`FG91EcLA$5QfMgFL z)bC|RQkZGFAhTd7{W9Ck{4v=RG!EjCo4;mA?N3r(tdo3-E)1X*y6jNtSUDXOZjP(! zOK4*U3j4eIoY{h>qmjxKrH2a^uro$}y^&dS==F{ny)i?(fZA;@@}WpagrtHXQ>3xY ztn+Z6lWum85&A-Oa-VL3?$=-upCJzHmW-qJ=VsA0 z{eqC-1w}>MYE2Td1OMmF`&T@^BcHFX$@KNibS-Qqa2LEsP?k^fiWW-LW)?V=&#f1l zH0>1u+Y%*j*Pe&$t6NbwGo1mJTyr&%QotwY$Y0~rdAHtHU35(-Yn67}g}>Y*tbNHs z^FmyO4VE3jLrmJ6ACadN4ot;PmhR6u7NGYUR+;Vw6DHR@wppBzuX(z9?dp#aziP5! zw-1e5%RvV_UR&5N0?zlX@sb-FW0V6FmZwxcg%la1Y*|8NfQDR9!Q%fJT9FY=5vKac znig&qx;tU9x_MP8OMa%gSeKTBY?{6Vdd20vyLxKmVso9{x)2CHz`I!FL60u-W$aDQ z*z?i{)M61W!m5}?W|;0Y09EB%c3-||U+jQ}1|U;5UJTq4?E>R$ifb>+QA^F>c#;4D z@~!|G2q92Vsuz$2oIFHbk$!IB!Z=xgvypbTyH9a+bS3Du;su}ugDD}jE}#;t_I{|_ z>H=^i+1qCZ3&rs6FibE>n)~CbRZF=~{eKiD@x74&3C#U-_9HXh0QlIciW%hd)MKOa zsjOB%_#T79;}W14=4+OYHorV~+5iTaL6>QNoyNijP}a-c=z20u&0x*QPH~Lmq`P1J zbDLSdMmx;(1nQh{%pnNjnA^~p@hd&CwR&}sL{2p@)6kZ*|5<01Bc?X^z}pXhJKQEQ zH4=CU{30nW_{=-A0}L?HzL2|`fb6sfMxMFqkZ1> za$4P+$)X^r=pk2Ud!_#Te0qkEys4!!X+Gb>nj)2cX8RoV6*a77Sr!swdU{W!qWyjS zYVrix-KQ9KkoFL3ELIvZMl3Va-M;ScHOuvuPeXN&I)lQ10uAwMJM5lTDLBht=pnz% z&Jg#KFXJufUfC?bhO$2CM@h`LG56(>+Scp`n)jKJ0S9GQ4|9Td+t^)?m2!L6=;mo< zD;+h4NEaD8y=6gg>D@TEdP=noq(gGK?GOx58)O9~7)KOBgPDPA}xcciIrUt zMpK`?Qsvct`x-uhBQ>a{1kMrByMH9L!5dtA%E^YF)&?Ab;fw-F_bqtKMqA|uM&!zx zGQ@#p^zgMbL~ck=aA~y}}c>`lmb7%45IDH7F&p{mX!5vNg+h=ZP7yA?b4J zvyEj$kw!m!;}T)uPvF|6K^BZ!&%=W-nrU9`oi-F(T5jCQ8_vu#aH(W0nRA71K9g3Q z^R(WvZ5-w+jNfrKa&0j7+;{$JS{v+Z!idOF8x$Vx7HP#-iaWz>f#lQluzQovZ3)>uy{SXTCnUxY zRwuwU;EIA3w*MHd?KF>@tWv`9lS96?W{uInm@vCIqgKL>VGu9;kBR?k7i8f;j5jkL z`=XJhgJ%oM&b^W4p$$VyCHZB884@5j{Ct{0OmCl=Up(!wSDhh|WO?pmVYPJm9V*-V5d1Xro!8+K86YXol3bRztC~@w5%tj3 z#?y;*J}aGWY#=f#V-=X={a#cAkRTZB9RH8R-UVf|EHSUok&dJ zZnlvt4#7v2ya#MK>FgO}TejZ`82LYB+B}_f%q}PQO|@;N9S_Ets;ffb03`CTg>j9= zdY9IG-7jSxiC7?*Sr3`B7_pH9q%vc|;c?8~z4jY7vLyHz1PLM@Z>dz(6U$IaaF!FJ zD^2p#3D=>Y$;mZ9PORU`-zcY~iKNO=cC;h26rG&H>8=tG;@qDsN1vnnD&-qBxcTq@Xk%NFMI3wC7N~)>K!r#3=Z(XiF8lr}nFj z3Pho(D6-aM)(vB6X0bZo$cT|h4d)p}U=W5(T1|#`V=hv;Eo8oP#NnLo8lwrbu7N^K6PDQgM|1jJ*^WQ|h`wO!IJYZaT73hPj)iNW?+GaC5hBvl)DRwMM` zbD?ccFd`#07`Ytl@e{Yh-EF+pOC&Q^(iGo9O5>;*_qYE%!dBFH6E92jrE|h zp^OSxL}3HI$6f>8n0{!z@s1LzhVM|lSZ}Z<^n!jf=}44FlFnFKjrhRC3dJj*J5M&W zv}`Zz&#M(c7?ES;7h3wQi_&|JddK7jw=P8Tjxa4QeSj7oo*E}z-OfMbOpns6-3Oy@ zPV!mUNZxv<8R*YaKno8PLzy}$1xRnDw|vbKeUjQ-4YZ)2IJYpxcMQHTFFM=Y0d>_D zMgG+CTGfhDIQ?I}KqOe5HT%qWCa{Js^>+O`=^;Mg^LZ|{VZ};GVg2EtuHmKM0PQB! zU{*)%!O-uYN`<0YE}#BWv&}oc=_1%_x`8f zJbUr#w}m$&(`)XXTeSB!TV2Z)Tn1NBZgqO$^K3-fTpmwaD3nNW2=ELX1y9yxOQpg> zDVGNWW+M#TdTCqiN+9D&I10gZy8OcI;rYX}hqMa(A*`}zw>sq7Pd}{w{0nan96QhS zG2~WBdxw6(cjoLF-^F9bt-Y=9jN<%05AQp26tB&e6x%^!JS~Ak9nqC*~5rP6p5%d<1L{?{b^h zz%)EOD+5RjOOzOE2w3i89G)wiOGD6(l_AKpBUl7(fJ76W_-R-lJ<;|&48hrKBW}|J zRtCbF5s}9fqTE&La=_IvrCb-ZgPi1Be<0F3kt)M;UYvNMLpiRy<>c(kVlbe#bV>>b ziHsGs+5uX%6)?E^GeumGQNiIpW*>dQMjJL|3x zblYD(R+74vIY&)pCwho-nR_EJH4mB_;bwIXoIjXqGvHLYglJ+{jrh+*=v-&GOU?{@ zk=kIpVciAgS9D#8lm*`DJlyB^*=VOr{ypG;*A(+O{E* zk#I=jMsgg)(If6e2(Y-d=o9k=GS5X?v=>*vv6< zDw9>a8Y3ZQgF@mel=X_4vr7gqr-#Ay`POT#8iuL>g)*HrMj(H#+wgLrDPE-ZAu0TX?+dy7Ab1{^L zxm~^1HYS$$nbDDEJYh}Cti9XN;4N<%O1|u#eXW90qy2Z4)$flmR>M?Vx9{F^k>aJ# znFnSSh;unE*xTxO@~b%0zgx3?Ez8k~vkVZ(s<%9+ook1wd1K0=Q^9(R z1LR_thN4b>HC)*5a%3_AeZ!}uFscMZ#A08K&(eKMKGN4`z*x%+xE42yGK15GJO8ru zZ9!?)*V%5@`drcRH~t~m9&Z}yn*J{|Q4#JtQ&f~-4pU7daqWighb2(^FX@LNX`OhMU3(7^{W*b~#0EbDR8;}S_l%&-XOk~qXA|=u9^78AEwQu-T zwvKM^NL)_F#p?xKi1}ubog(iv!Q5()9XSzkDdlNnuk>ZjVVVg0fmq!*r#tP&2=50{ z-@m$)k<95U6LxwJ{dnOEe)*t$aI4;N?Oe=0e=SqAoKIAx|_n@_mhXOckqIM_rB+?MH{g>IAC$F9uh7M95*#0v= z;oz(lJ@QZ9srgAzJ!^9i2GQYR7+`{BJ0Ha6fB7#5AdZ}EpWZJ?HFi4G$GYm)8IF4A z#54H`@Q;elX(@x?5ByBFjR+EJ7#$h1A^@faJ;u!(v z)j)j(0bf++IInE4jCh!9>MbiN zCs(5A0rwlO-xzqpM585H_H;dWS#z`))7Uk?T5eVsn`JkG2m3Qla_7cdpt%F`-LDU) zT&?(jai<>RXlh(LJSR~IwH7_51g!BsPNu44p2w36VaRU3!Z5%(M8nC!44mA2sdun9 zAGIqNtzif|E9jXx92f~qGg=o}*OfymXl1b`6IyeMz1tY+Ls}!mh6dBna}5V2CU}O~ zCYPBpFs${cuA&1xW^yU$aQO0MIOibOs_V%fRzL_$^%wuRn!F6e@L86G9|!mo@jhS! zTOQ!Yy-<>QJ{bZvR&GtiViWk7e2Wcn;W6o7y-I$dc=f;QcqD$-|J@vu`>Qw!WTfbE zcB7RGq?a(_`cp=?y$hwb>A<$V39#)d5N&S(HY*PYpnIUMe55yE`l8pVnrnHXRQYmK zC5nQ`a=5C`b8ISC4MYUd0v6cOy`>Er5> zS+7Y34{RV#(y|$+oW46>NX@Wj%!u1=02pBn%-CdX#nkjvhMgTIItX0L48vyS{VJ62 z@Gg^6^p3dp;-e07PK@c_^_!Nj41UZo8GvU42f?3}GRw}&0&%9?JzfIM)j17xE9r znmScR>j=9`v8@?WD!6Xu>3Xs#)=6RRRtAjFC|DV(njCN7TX82rf88AGY9eqD8o-O` zXifumsL0V21p>oQ1P? z+}0}=Z8S8ILff`NGdQErCb1Pt*&LC!NUubp&5`P0fq{mS*J-thY8$4`mgr_I@JVR2 zB@ka9NYFHZ#{@SnKq&n52M*!26ctdLG$n{6 z2PB!Gn}~{}$gXcys2AZPUI&7fGO}S0$HEvgDHDhL%#MiO>qC#z4ZWN~f-2YO&+JNt|u_Z%#z`W899gLb5+w0s9El&5XzP+U|W_G`3G(G;R>J zP|ibTpda^XxWzhv1XeOa;qziIAm#a`uftO}fxC+cKoy#5+z?bN+wg16VzdU#eS9Y0 zhDBTb#9)5NnwTF|M0u(3E5Yry?^KG9-2OmYdjpYwpawYG{iZiv6l<*CE`J+P$jbh6 z@AzEu2yt^H>(|U2>Pl%j-i7snCrqOiXVo^5S20#-t-W{zrO3N}M)GVK$0}@W5y|V* zrV7_B9T0PZPK7VJ6t`Vtp(|Hv)$$7y_y#N2&7ylUhf|X<&ETtY+nYju2Ng|x0d^-J z$95oJwn6eNevU`u9&v`jc87RdxgOTOt|9@((_AH^@h2AD8cPWcBW__^K$m!h1CS-$ zjg?K9f=R8fvhl|Hvl+YH?uV#dI!ahE9D_UOve0~Rbwelzk`5=@Bgzo1u~u5r+9WMb zIcoB<#jFxR}qEOea6z$TPao z5iKFGUkRGaN4kdb$^ZLeKOM`{)tRLu@GJnX?eQyiUO%>8`AG)rFq_YG9JtBw#I~)w z?#>vk@!Dat!4`u10p=+&CS|%H2d`1>R?m5366QMw17K zz!<447dHZk$5Utw=&k_(wcG7}KkKTu&xSeQ3r)%7V~-VeE21El^k!mD`*E{?GjKoG z9GS2zQzy%6W6E5V+b_6#%-{d;{2fC7^8{qdB`{7&~}U2tSH(05wcxrYR=rHF+Y zk)rW%#02D6-oi6*=CE@VrkN@jRD1;l)tEuRav>fZW~ok-iYMM&nkO&&AwB?lbO>Q$ zgEXU)NoImZw~I#Z&-r^Z(K1;WQaic@0KnWDCSt|zmU@!sCkd__EPgR9P($)&5*S!q zTw=R5WtwHYrtUp{I~doHQ|c*4#Zj}rXhus0Hcx4blJt|A+-a$k5WqXf3cH&ZIw7+7 zsa|dZCqL;PJj?Uckh}dlj-SDvVxOG}g<3nBm3YX=48e*wvC-I~z^fWB8>%>-xQQo6 z6Vt$xYZYZy7-pxaX(B|cwc3|%L}wmz4Rbp7Khv zTi(i_1XiU_8--&p?!_QL5JuGNI6P7DggU$P@fho+*C2852wfs`PN6hp zJvCZ=Pp}HuG3Ns>Ju(?d+?kuwoV9Wbq{&BdCj0v#S8ylcD1Av)FK~zBJARFW)?C#t(9fe$1_Jo9m2%GX4Z2cUFCYyVf=X1kb200_HbM{uFvaw!m zRW)T@^-|UW0`7sqe05HHKvWGBY66;t=#G=ziYR6|6l54iH{=zs;ZFD=MyZr_%{bH#^^xx%Lg63rQPzDg#Cm zb!`QsCU*vzow>s!Z^NqIo*~>W4R5bGBiTBP!H1WIRu`u_xQyi5;FsfwPIv*=ncP49 zQtz2UDgTG0@9By2pRM)}k2-A%+&}<&W-O;arP}DwpFbTxYFcf8{e7unk_i29%899S z68?60$f>2CSUCM7BD$uz{g>DW`#10M+(4rW4Z|ibtfszb8Mf(x(K1isnk*OJY^^ng zquJuqPV7Y?Nhsomn2!hLx;aT}VN?Xfc#!u~myV%4GgfX5}dtuh3R z?aWg7`2C#SUkS9ufifEVo2S2HEfT^PEwuaPX6;GmpfzXqa74>;(AJ?ze#i`umke@x z*&Rqh9DY<%XFS@b=`1^>e4gxQ8*uCQL`I`=^nK-8pmzuE`8APkR|pI~Pfze8$(@CU z1x`4tH+fFz924q$3L8FrmPE+ut(eDA|ATp_$wWq3L7%bwQ&F&mE5H`uZ>&KBGz9S) z;m7GB=Z4)|0AJNE#c*BFcmueaBfew6 zZgZ2%Xa09<2(TwxFQ#wA03J=lXjz#8CQBqK3tOAuO1c1%(jvcPAdV-s`S#J_d^(u} z{J=_Co&~dw^&xIaT*`pA8mLIHrVLPJ!VzsSo8_Z_Tn-UPLjuW!^C4k~fCC=47X{WR zmf|dX*Bv2k91vWFAMwEQUXN95LJ#0-mYI67ts69HJGTu_NVY>X9IFV~*Kk59d1K#Z zSdY+a(nb_daax{b^-4v8sWQqPE&X206f!_Yk5KkPRXaq}cn?-e(I_|loU;M_u1h|J zd){s;=}0icwIJQp$+}gKtRD&E(Fm)6pMFU`_I5g71J;Xr={Mv}m-;IyY$6?$lY4oW z0sFaHO<;E$)*v4iz(hs!7ZhfI_FUip-+v1lJD9HjcUwW|71gOV4Ror#%jt7}`sk6pCFVhKzs1nTf>Mf!(&=v*%#> zMCxAzU0p67YaMyv)$S|tuCDrr&Yj_7_G%Lup;-Nbi_8}2(#~2$uI>jqBu`?oWXp2V zfsY>2^wsrQXg}G^(hV`WknV&C>VL;<%0-jgHFTAOnH_05>~;JxIIQc+t~^~lC4#wk zquN8#rW6aMay@jSN5n}Z7eZ_H1U)7S+EQ!1OoruSZQi#oxBBkN|0^pe6yx-p0r(aN z=@7xTOWg2T>6br`3;PL5J$7ou> z_nUND{*1Tkc30D--s(^%0d%1If%9czf5FA24UnNOkL>V{#Z@gUQs{3le&x>!Al9}^ zMUksUuqX?N&PbN*pUpeA)fvrn%eK4nO_u9q9}b4ewVOVKuWmbF>_dZ}sMw1&d=b8g zw=VCG$a9KTF~B)prYmgs;w8FIaj+-};Lb|SVC%r8B^V|8gd=gfRChB&DWgZv)w&Fk z8Q_T=u*Fh`f3dDUU=6Kz^aCVWtdqPpyBf8FG)~ycKB-SusPhC}(Js*pS8~v%)m~DH z0L@l>TZ|>+u-sVM4)H@t>U=iS*N!f{c@bvp$a>3d?wcidb<8GP`24r;?F&GW4Fgw`M)hf*TWto9H$!@I))xS_*A&@xev^S}2S+6aUQI3{?^E?>h>(tb=XfQ7f*SK=SErbwwB|EN6#9CRY ztq+%O>UhD&@}oOuSMvjSH6Z%HF1JKu7>I)fzD}zY)r(D=rJHmgJ}f|3fXfO{kraP& ziKN;H12~v6NuxS%#=t@`Y9}{4_OZb@l7DXX!aG?bz@x4Nq zn7tuMCFI4nN!l=n58@VZ(kyEkwnkG$0hIAjjT;}QE$BMNL#PDBTpb2JX0`miCjcWo z>K<8>H@{vD7KuP)pYROKScK~Q<; zR2{PM$Qu=a-U3gKEUoL}xF4-=z=z;Lp=o|RCUFi(F=fg4nW7lC=^H4;DQ@HB03Hi} z3~V?2j5fRFWLd?cAvL4|&u#nWWy1wMk7jS;tca7r=nD*V!1jHvUe#sJp-S?(I9UaQ z4TpFG1l3$TwDC!jG#)kC5mQE!&A#DH_-x-n&YH zp*oGnJP>J`x~#`ZV2q;7gapTy^$M|Rbh`qEG+mwIbWfzo{rS4w0&-V4%U!t-M*7w@ z0^SEtqX}J)tK!7ADf1awUE)GDk{qf3jZNSv!%fx^)`gg}k80LNAwydvj;Etg)T|aB z35fK|jf|pcv3T?u1|8KRk}SZ);f#D-MAy0daumr3d9@+ymfKvu?R>7>Yk6x)_D-W} zM;g%{RN=la$x-qB-9y|l3gfopcqHylHyhb7x#)382uucvns$YQ!NicnCSAPSVm*E* z(b3sG%(5luy59V|HHYaeu}VDp$~)7@)hG1St|%W4c#JIH@L_nSKF)i)T2l;`0=4y; zUM_lKyRpk|ysu=|Q{274h4Uwx>S}9hQ~iE#==4cn#{P4yLGe|Qj8@WPGUsDwN{OKbOMO1Bo8eRMTd972ihUCi8eeSLEa1-Un{f)O;0BnixL>(&KyAk`quvm}eNwiV2bghD@IKk@)HViG1E0OCF}&v=VEYlOZFU`rirh3TwMj9hXPs z2aZLiBA42=#RJj!|35T23-b#CiC&5DpuR4Kx2)87p{wq*zy8JRdIcSkQ#<9GQ{U>- z5~&harf!d!8srsBe%E{%pwapJYXB281+plj^VR_VI{$Tl`g_@Vly+-+zIp8bJj7pw zzUWr)){t%ABp^0|T$#UhvokT@dHtz={5lxx<>IdUCiSti0a0z2nUQ0bncmDA0{0_8 z!Kqi=eTzLlS;hz3tsuPgAE^uZSoxbSUz>+{gMZ!F3G;zWKb5)8 zvVJb!9Y`NlW*5~dqg$pQX)%icu$U(T1(4DRH$^$yi)PMU2c6}=I`g1Q0+gfQ#Yz`i z4D@9{w=&~EnId*GTzok*HcqnlW&exVke6*Llqva8naifR@?udlUV^@4I=DFb+R+?x@f4u8+TbE`iQ0K{zS}(zOk8;e z{v4q_xlO{%1m=6bA0*34B7qn*%h41C?Y=I{6}E}nCU>196DMlfP7pUihqRXNNqe!H zaY?m^mFg(;omlV$-D<0b?aYzbj?(H^G9T8&wx21VN)g?i^Mx2@IK?jG6iX%|3;J*X z^myz>kI^q*=d5_w?*?T54ZFERmzK`;t=add=D4YYnaV�W-gOcvg3HE~xxq{zXX~ z_7@CJH3UgZ&_J3x0eyZ_|CZj)k-5#(rvxU}Uh+ zoJ#hcJ*-_CXIO(ay^M#KFZMC&bgy?2e2RPv0j;UjqS99#B8GNrcbbKs)Iefgj+y{Eoc2;4;}9&)&;hf-4>M1qhu#q=L1K8_z2+sUsE=O$((xR zEf(0?ilG*f_x-(QlzBjQ*&au4dsrkR`A|n(CfLKWZe9BO5|~?< z<5OL-E^9Y2zI1>2-yLIn0RMN*G`LS0M3h;|vh?x>M^cTgs@fAcL$UVP^b387M~q>$ zMlL|+zFrYv{`x@aAkRz)lIT;+=NdUmSgC~uLXpa>{k|GR|CI`%)iJ%_Sw^ z*A@CR!6?gQnV?HrO)D-YiG}4}&C0#Phj7AIlZCQphqu|evR+neZ1~G-h5HIbJ+)pm z&l}S(e6x)hk+rGiO1%oKy2<>4(;0$@)qfFK*uhgai#`;CI4+HlsY$6HwZp0_^#XD`H|Qq&5BMMh0*yF!=2(-F^`5I#BS*{73YYanB)b^&#C*hmDiV1F zhC**fpNKE)77MhdvxXV=*dy3ST1T{aysF(!Q;)|QM|ctnKKS9eKMaEv@yB45>|j`K zTEUvbDOs+jxll8Z=mI$I&5don(S+dC-|K4}8FB*G7Q9f8yugoH5OWxY7DUj0*Gu{< zAa&9Lam3ZZJ>cadjcB`zc|mK2v?~ijLc4A4hIS@uHhDGiNE9Y7bFNHj*GXmcnDA^o z@{seSjCfVkrTTv=+t)BV82jh<8aLm@am{)X>%r-j+1|av!sa`7j$Xf`9Xbh5Pe##H znB~6?AxpIRAxlCk;@^!Ai{b)>DU4H|{J3R+?-{VW{+LNClR#N+UIGfjWrco@t#2yTFFvb(> zEJAScb1lM(-UzFrUzYUpvfrfJjpp0{#KF4*I8Gb_qMs6YD@3jKtR(X+&2q5F6u898 zfr0))ttb_WwMF&Sfxr{*ys-#3uv;((BGEa&w4F!DIz%Jru`_6+1|)v3!CqU+JQ&by zNJ}!Rg&-Qh{b>9djzAA*XNBpeFW}K-L{q?U z2rp&xl91y$W{Q$j@-uPfz;MJ*z`CVF3+1NK{mY`xv|^ z(Q$l|P{DN_sB95{5&g{ggmO}WV0&#Y4e@*A5rd2EYmMJ!IQ|@cK|4Emz?VQK8a*2W zL;O+3p7HMuV4!MbzIdD_m#}OnXAlWlavFx~HI{Ha_h^@c^OBT1lA)QMoitc(`+_5} zmKU+W;PIv5_ZmL;C3G!wM$Xm_?S+ia^O?n=`$a*@56E$@jjLg2xMeC&gOAT``Z{)| zClJ!G2Ma7ZR(7FO_jHpnLmfgYh!5j;6Y5q^gXJC#uslffPPSMI3#+TA7lOa4cd zQ=wO*@$Qc|<@wYO_w(iqZI9WIw@H5N+4k?*r6L+-B{P4Bhj6~+-~ZI6H5FX3h~8dp zK$ddc#+$JNsgr&-o-D+>$7rOx?8O__UVvNSFq&8}RqJ$!c4^7@z@Eq#7mdx$bx73w zAe>Q@%8X$}VAGNQO-eDH8kHCjpaWL>@xWguOVj?|-Nkzd!1wQ*3b75pA8T7|{lz|R zJvIS)2mlC_rPQ2m)%AZp%uMS;g4<8nb-No}or_4m=d5#kyI5Ja2bRN9R_;Bxf9|SL z09mVwl@#LacZYXqouMNqNJ@{KI#cO&I=859RlxGdL748!##Up(uebTmZdW-4oU^?# z$X}g``xM7GL00d9@?t^nq%ysZ_aTMYtE_Rm5Zp_MtCPbLTY}uTM~jWv>(sl$oGA{h zhhhXy1;VB!snE6-U2mkN(@P?KaKn*nbgf9awOMY3T}XG;0ihoU9)$Y;!k^@zguwSc3ri}TUQAY7Kg9hmi>%Ps5};d~t#nlAMaA$am}z&;!5 z7L2y$R<&8agPV!g-NU5I_P1gT;0$&G0Nx9HfXK831PK=d3Zwf0jV5dXgHMQtjVg1d z1Y`8ifdI2^CP3iZ91xJl<$wat_SNXRX=JwQdccA#rUD-DeG~A(HI@SbaQ+)`5SWfY z2!>Pw5d>#%Acn9U4J4q=9|uy<Qp8xlyG4I>QfQ*=}fV5FA*tbl_L6@6!q-WXar13IYT?3 zu8dk1o$`l-2)gC!h1eH!Wh$u9Qm8Trn(N3ymP%lGjka=QB8tAMoij~H4QfHjoTAp1 z&R=n(;!Y}VnAh_q2MP*PIyc2x@t$7s1XE&XvC4;VJ)$pXFvf}SeGRXId0(>Y0<7Uy z5a5PFhZS*HFG#Rr`+Y^L#4Weo5h~0eI(OZ3-vi-MQFh{EFBRjVN6NfsgTvZH`%a9( z&s6Mp>QWxYOE4tPd}C-TGTF%O-c=@~K-0kZo>}pP(NY5Yyut_nh?7=jtc4kf;ezb5 z7=KlCa#S&>rZ;K6W5#;LCKrQEE|ywGi!H>)k%#L?XHATC$VUNObjdDF)+T>8Yc|kg?bGkW)na7k<&E% zsBKbU#>l|1Ub9$n;w4CwBw317bEHW(R|f5pwCVL+pMEdmsw{up|4H)uXpWGn&Im$c z2$~?F>{d2G`Fh;X%4Uk@wH-Mr+{aFQlrc_5N0;YcQ8LpQpPD)%JT8q~KJVcABi1~B z^g(pl*{t6*WGjB$LXhxN6@q_Loz)yl4c-#Mydc&A0&o}+IfUp#L>?dlqTYb0w+o1% zBfL!n0M-E@FaShgJ^%m!^f3Tr0Dyo#6fR51BGafgdNW1v%z30Bp2gA{qp=#N@tUBC znlwm2O@?;ZDcS{kV`@MwXTZ?{Ge3(ZNVbjIDUX5)qM&^e(JDkaEnmONp$I<5A`T^4 zMS69dR!?6v(K>zCL-X+AsL?b_k!aJ`V#VYuohXU#( z71l}g>de)o*3yIk{b0p>6f~8;-~`iH&vb&41jimxg2t>21LsjZY6^c0aSHc>Y4l)= IKGdgV1zXGahX4Qo diff --git a/docs/_static/fonts/overpass-semibold.otf b/docs/_static/fonts/overpass-semibold.otf deleted file mode 100644 index 176fb43ce14a23251c04318345785f99bf52f2c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65704 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

  • v)3VY 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 jcI43x~Xx%sI!5oSY2S zgw0|ac6VY*ilcJk!ZOCPnlmx`XR#Tff(KxRhv*;8>X7<+ROW4*Kk zvWF$4oQgWZxaJAQ{0C-aN5zhRed;mB{N|$mg#5DH%B(-*KV~c;hp}eMik-OyrpYVo zaPI>^k75+~mFj{}e*&)C6_>fE7$;^J7~@SCGvt)zPO0P{X5tom3!pF0Epvv){$)n} zi;VTIsH~`RU#nx|85{aD?mHOEWc)+qI6%YL){}kT9N(<(?@Xil4khe^qR7s^^sn=O z&DU<#hM}&8NmPn|zcVHsVgXWb7AtjUcW^86c`Sl|&Du*FSR1J`Yc0)Z!=#=pReBV4 znzNqLzgQFL2srowGitiCCVV`gl(pt|)T?2cfDG!FJ6M0dn?*>wS!Zb|i`8Tze}eU8 z|3d#oECtX}YJ)z}hW)_8_!Dd}`;N8a_1CUotW^FK3z3|xzjP0ak{)19r702groUT?Y$Dfl4`2d>9J+ZxtZlY{(9lo5Zx6Mi2nAe@nQ#Q1mf->%7g zKkFrhpiXZ#Sh9jf;%{fv9mCox`2;qYH)Zj>>9r$LB=T04sTqg5C|B-NJG9|XY~?^aWi@fgAOi4LX{EjupUV26)|*#cR@7Uj=%ymf+JUKpgNM zq{+MXqjZ+VX?_BIsvarwlrmT|DH-~g4jz;M|BoTJr-0ig(0zclKN0G^kDbAQP1ef04@3xi&^ zCEZl|8Ux)Yo0TJd!budyAC# ztniBTgJg8Olx*fp-1qqhqJebepHi|f(u>=rusubW-h}T-fX@lPb{6_|3h5Q3Un2b! z>6=Ku=f-R2z^g39R)}BFMa?A0F3@W`uwRrNAv;!5vSrwl)E3a4wTE5#lWikSmbzn% zUEnQUFG5OoLH2f2s?kB-zA};r(Q>;K`l{TApCDV6)U>}hjq>`^j@Nyv>RUUKP5bdP|IxC=d)K}w_V+<;z)CZ7J ztY!o2NOQ5~qrWb4qxS4y=dUf)ZdGPyOt!v%n6b4|FX<(wg9SV&jYRoiHRa>jcpgjj z{Ct&_d7Wl@^^X8j2U(Sbk^JeC}<9l!3!g5+8f!SL}t`DU6r|2RS6ZP1zjVfqoezf%=`F? zBdFYW;h>A*PFGb)MY-b^m3{SYY*bR^$aT0~xdqO$T-PK=Md6KDB{@rLoQ{-=a(9)Q z9Z}*gc9oPDxhu-U9XZ7nWw}+3K^6IvO3E83?3mw)XpD*Y?+Gn-yDQ_OqH1evBVEpd z;#_xRennZM!UDphkkFtTZQDB1O7flMRZgR^VOV9f8+aOSH0Bh8Lc-sXT~X++&2>2) zC@5817dWcR3!E;8yV&W-PEB)UR65Jm%HHn79X^J}M8-s_oq5|*H~AHnC6HmBv$Uc% z+>u*eK!v%bRTYlhn%t7o+`Lk!qZSMUi&Nrm5K~oB8d>2gipoey zGa8L;@lQo0GdbOnl98U{NJ~vjPR~wu7#ktth;YRAaHKf%T-CX*sbF<#|ikc6~kpzCxLRRA9nE7ABj`WziGa3=?G#a-d3a+j1GbcL(5pthvI=_qj4 zfV#>uCpd^+@+(R~R)s6qT>`xzfjBB%6%(EL?y7L5i|WeC3YS|MO}U%za-uFY(pgxD z8wx79`J`?o`3lEMp-j~!7&;%Fmz7nQm$*xu=#01toX~p>;gRbobUBfrw1T8m=)!Uc zXijpJlsjsROY(~qY^oe(xl~rnF{d5RTW8! z0{*0=L3|Kql|sOEEm0JYutCSwRnCHNu&TNMq7QeJRTPvIk`fSR7!j1XO7g1RC?SMP zr#fIDr4{8xlwvGggW2U3Zbuc&mAn87%c@Adt0G}gDpNs!NqK%L#-N7fQy~UdNsY>M zA{zJebIS>xJZNw!A>u5{a~2d(?nW$tS5$>d9Zl6mbXVoG1uuKSYS^4IlF#=zXuSz- z_F_w96Sg-a(gPRh@1{04Y*FnB)TX@U>sF<9jPXTXa11YSd+*#{zme-WHD$0qwL}q-o zyST#jcjBr_ir~;-|1^w~a8Rxog? z*!`)~2)t|QjgGpy{JP&pSD0^ZGb|K><~E;s7eak2Y6)4etN;^LMR`@6(HPUok?zDa z?=_DbP=_mWDIN%Pl|cL@Xom@{8WL&HAoBK(>$ZaiH|sQP+c&RyXASh_EG>j&Vmtlk zmbawL*W2~kqcPKzx$O3HhN56JCwnIiXD;SmMRcS`5T-hLB1%AnK;>%K3zv+bOL0nW z@?wqsd=)CH)0x+=6*#>7B+uuDM~ukD9Eu>tImPXBcE#0Yx#bZEFA9`6i?&zE6N7tT zCOI2S0IrHkR|y3)Wk3?<(NMk2=|)30!io}SX+f0|3{X270A1w4iy^d99XXI_n87Q6 zthbF9XUu0M@YOXX&RXyUs!xMMTV0S&SExqC-^6))nV^}{{O@jBoh{(zs~pZLmEc~9 zTd`?3f+5&aBLnnWo)44!3K!;dxK_pIC0-YZIth8_6x4tV@OtKQidryxl3jTH0oaJS z2n?Z!k7fw+(UoWg??j5APJcu+&6?dhDUl4-BecCHee=-DEj9R7om->2H`)+_Iasha zg1{iY$gr%!4WHmFFQ{;VZ)9i%2shj%xF8pEvlXH0lzeBUV$QkwlgcY<5jhp948QIJ zVbhK9xE0PcL6e9ZA?;FwNt7aj_z&U%Z@R0zxq(2h^P(^kL^L=j#V=6E>eXsE>rxP0 zR$ZmUQjOjOY+RoScZ^8Q8JICF$AKDI@##6Euv&1$r;l-rnvAm4^u)AbNvY`r90_Qbog_5u z8SPRWz$I}YdX7&>O-s!g74Aq$%}J*|Q_yL=BQriLCpB?cT6~rxb66G*qmt1_61q)K zO;5?fD9J;Tv0y|;i5Z!rvQh^O%n3)M928=uo)w>zJS0AAa5!O@0g|&EN|i`pi9Q_3 z!>Muh!1%N@2QlP&AC7?;X-TM^kPPhOv8+_l0pSY&!W~KRL*fSz1-^c%nwNqG4iKjX zB&R25#ixZkvNMwtQz--1rDi230zuRSyFolk(G#MJ?Bt=tP=I>AAs~Z+$qMSgIUfHd zl76TZr-MT3CnqBdJn*72A~icX+!3FZnoUAT$;udl&LIl$h-e%J7NRQjOvRVPLS=MM zS$tnt2-Kq1UdAOQ$ETq~=tcV9>qg#Yg`Zzm73Gc0qbhTYoRO8qmHiQtm5nbc=!b>p z_*!S4!$FO!yc;1!<<-jG0L`JL&O&z-Ie*M5#qP4w)Ivw9qc|5cY?YH%!__V*KH@!0 z3Yc3l2Pv~AMJkB#$R?_aE2?SHp+q`GC5X+i+6Fv@2j;(Mz=Q*M}vsWR}K;vp#>T9dW(>&HXs8-x;oq zR|Q%sfSu#N?D^*Y{?kY$z}o@*9pHisX#qwoL+WCaP*%YT@q2q-C82hy!UYFQQE+sl zzs98_fV&%VAbFHSB5tJ?@jC~l70OtI!64-GF(%czl?*%LZYR`Jv{+~#c^u-N% z#<3{;)hd6Hz@2oZ7+i5fviSr3${axF+0HElz>;4ps7QNYRM$#uBXp?@1FYQA&~_%PK`$fzl#KJOf&srtsAW zX{mpWIg$x$PDk%4sF@B5i6g0yAeCn0*MYXT=7<9tOWI2wC@hKIDx^-qAQh zB7KNZ{wUXgK_+Z48I%oyXGlX%^yR}O7k&G@8(ARHOS zcB*HpMygUxcU3DV`pZ#HSd;fBjrX-vF;sD{!F`n<`QVa`4=IlUaOcA=X{!7jvAyzPtz(8*92x(yIQD9+JFO?hsX^hvdst z9?|?u_X_amEBjBpP<1Q{G?5o?pshj1RD<|H_imgQd^)3QFL8u;LAa}OpjI??5cKFz9&O|B?^xke4pxl8tV=9N?w&(kUgu`*%%Yz`>kio z0<{mypo*lU_UogA>gEHZ23#8aqmO!;^Hi->_5MaYRV`BQ5M8&Efa)t6 zW+;ktQ!p2%19AW~KV~zdqYX;QE=i-Zk!z%X4jamdBZUC+KR#-Fc#*`YojRA0hagE( zy}wIUjp}_ZZxvGwL_cKpG*(CSLUZ1KCjr&MXiiWyiRM7!y)RByIjee|D)dP{+@~k1 zOnpAQvF}j5c?Igb&_eYyJ_^atkY}K4vVt4qmd4g`qr6qGL;P0c1MX)j93z^^PN=U2 zd8Dg$d|NsAw5qYaS1GoU56l{SY?6tOa>9X9_HJC4(QH5%lTD~`gDMvv z?iuKTR&m5NnuTtPHgAh}<1uOOQsWBW8cNls1}@yBl^8{x`zh+6d6RUP=u_oOa~0uz z^NjR=(LW!ZLom{fbKngz&x+Qq@kn{r+pkc3CeeaYffxvA8swSAFf0~b{7{7>58^RVQ9otSYP_$`Muk#{5-e7ftCX1u~H znw?z#mE_1D7b$(Kvl#WRQscx(YMDAu7vYL#UK&v?C)*(oP>f2mAK6GP?oo87+Mh~& z%t08|kk= zujGYDBYavxF}%-T`TG244iF~lNNNm3*S>gns)C2FPr9SZ(1&3|%%|S-`2)2b(S9qx zLv=~_)fs~9xK!!c*V?zX_SK=;?(gxoij}&)`QNA|kDqsa-R7g-$0@Qy-^#(qSsIJ* zRaaD$uToa&M(i2Te4GwS)s=~=y}rI~uXk!xL^I8e-iCT1uT3MwDWQEyrWvtKlo{kM}7F_dNuweJ8QhwQ1K#J6?)fOu?pq?_c8x_nca-r-`5_u z(=^gBRg3;F>kQ(`e_Cl!bWS$g*y>bG@mVHG(x(gRUIIlk4fR!dsk^;ul&tQu`LI@7 ztKQ^x@jOMF)FaX9Tb+?U_||%A^mLR4nq8o@w5v__u*7;xozUR%`GI+#%f5c+oe`jeJ(uXT&4wmu!`0 zT9xBBMpmkCb$M;4tJiDL+UlRI^Z#Ne>SztRmj#@Nn*R_@->|lz$cpAOiW#OrR;uoi z4``UDNphrd>b!L88SutA&ll18w1I5Jg+CfgjjI~syhKGuZj8GduY@8oa*m=ggr(Yt z8U@f^oNpc`Pwm@lQP-Zn`Qpa-K-EUlZJ&lvOQP1dhVW?$)l_-uo5_jGBu5`rK1uub zrMfAyCR|CIeEs=WayQ10|3q~|tHx`TMv>cfDc;!cf0~EXojG+5_N~;_IY6a^e5gvH zYPmEMlkCYmk_OP)oh+WHQ>~4xRNdVmNvLe%FIC!r78 zJ0a~XP@<#;uKWCMLma5;Km*6l z?OCfM-Kd4P8?kZ!KJ99}Ubx+Ssd|h5KkR?qUMFr|)#PB8OI_8Z<21&%&-I_qx=7k& zQ#9|Ahb@P6R3G7!R}Jpc{wrw{*;a!L8e7`UQP0g$G_@n0QR89KGj*oFnF3mOWn&GN z2K-auMTj24e;{&=&$Y6Zlc5|o0`=(ZiO$Ef@k=LB893ugRZg~(m;-xE@yZ?C$9k7E zaRlyCj~Q$jQo5!-vhYi1W}{F-XA5-Bo~~RCMtxclQrl!UQW+x|ebRUtXh&lYK`EWJ zC41{p3!-9}vXV?^15hi$J6<|k(YREfR-hy`V2U&YzrIm##EN=W$0N*Cz9fPM73X;L zO{b#N*C+)~+Uv{#4n92TM369z2V~+m3wP;ca2Q(A6_pM{nu&VqNg?%2SP{0gYnl$8 zWGU$Y^hy}0CyXkuXw{sFv8l!Y;FY6bK_d}$RFk-ugZuI5mDmG{IoI;~XoO686!@do`P ztdlSb;Y)Nk$hi|(jk7NDO|_~|B@jQ>Pao3_GAyF--%uhs(q^3 zO%uLPdcqt_q#}T>PkUfx2o$Pn%UKvgJKWb@1zLZ z7cEh5wDU-FjJhjarPQFAg!UAvCGCsA>ajmdGN?is#f0kKOD*nFfB1)YIq~ivliDHG z;?oUo@0*O_^hTgkuEE4X<$CTx9e*ZR08;wrOVz8}{RXf*@s?(57KnE;+b|moW_F+v z!a}i)*p9WwW?=_};hk7#)&+_j0i>hwkVFg~mgvg5vF>=3q9^OcdP6jQ@D+xBc=xkE zyIWD?M8z4UD2_4}j}{GvScgEx$%PJuX=Fn&hr!W}z+^KD?}muB@X;3NOyy%Y6!3v%etv-8k^4UW%sceY$lt?!s%dxkyBo@2|{a<+o4#JjMo z*&4Q%tz*x#^=t#%h{xA9vn^~Z+s3xD9c(At#dfnjY%kl#_TxR(gX{%%h`q>OVu#tw zd=)#wjsO%gBKw+s!@k8E&i`WH__$!yUc!OSJ*F1tECTn z%mB}I;Qb7Cjq7-Kp1`wtKA*y8^2hlHc!M`c>M6Z0y&;{~w9tfUHfdhc91Wfq{Hw$2 z2zG?x9gJv4S4W&9$uZNh&apK_7h(ws2nh`d3yBQL2^kmiOvs^-&qKZrl|uEQ%|cs* zT0;XvgG0N74h)?T>TG|i{ab&$DofX{0S^aT#TnQ09z2of@B%&+PErj)v?Mbk{M__-C!uB46CG3U$Emkbh4<76-=q=-%OI*XX&|p0`a6j(PjoieW z@TT0%oAKuS4&H)WcuQ{O0sKzhinr#0Jczg9HXh9F+`&V5C~wQ#@%B87ciC43^E#7lV@FXt7!l27I? zUd3y8EuY2jXK(Y_d=8(>=i%MkKw;QV9)Xw`96MtzrYXkm-$P4KR?J1@nif|{u)2d zPw?0IEBqvXgP-DW^0)Z={5{y@JN#XKnjhgu;nQ03egNCWFAL$yvTEJ6)bzb-t>GNLLgmk?ZEJ!za;TfbGy+Hj@Jp$Mn^i+kN zNVj-_zC^Iq3kQ&H^TKaPw|ikZ(j8v-0V%a7SPIzX1;S;w7g`|QJ=n3tni3^pF>5%on|I7%9;}fbTEC{#0m+6#hwp=17ltfyO`T z1uA>R3+IrMYzWQ*UiHFJq^|*v1F8Whyg;&f-3zryPkP}z(l@*?1?ed-e2NrbQc>VD zr1ae=f-eAX1KtH(0G##$NBW)@rXnSuNN^Ew2JivkO91hUfav(h3)7H(>;)^*PrN{S zM6?ln3m}|`?ymua6Tx%<(Li7T5KaXCfX}_K3~8Mg?n6p65ZntOoCszBzVgB>q=YxY zOaP5Xa6jN1FOa?vP6V?7-+5s!(tmkj4$|)dq=WMSm%OkL>5pDmfb=H->COXypS>U< zz2b$3kpAL@N09#Ng@=)n-V;0u_}vSOkpAI?$B+sykZdszDnL4Z)eDa!{kInuBb5R5 zfF*!Gz2JxRFE1F8Uh@KUf+Ndy_`&#G4~SOp@fhR*#2fnh2=5Ar0CWR%2cRCl#KQR9 z04j?IB%rK%v>H(31?WDX z1%R#-kS=rRD~B%NOF0Z*+hUw_!GsjDS71I;@Q8ryn^T*2kO!YQ?0}yJbOF2vcps1s zI0N_qK;wg#+{;G}9&+%GXJQ_2r2^3-wN`YF<)-LvJ-l zRUls*JPR-nc!H0?z$5rqWyoS`O0%k4d0KE>-NxsJc8VSe;I6x}_W;BLv zEQakX#cw%+kq3}(a5z-JY{wiSDv(ccgsOnpojHI%0r^k|bc=v|i6a)!75&4G9K8W? zC_jxfNd-jX%mG;waM+7uoeF#r(yc0xzYBq$5%9%GK_da_L`Z-NdHuG%4s0UiBH(M}k1!T0sX+5~s9pt{14EmsK=XF!9V*a#9@;_$))J{z z1-=YvYZVZmu+TsiXub`FUJy`x5enNQpgBKupb9kihE7m{Vw2DUfD?5#FxDP^kbvg4 z_V8Z>d<9(Qt12K4VloGS2Fzjn*G&qLJ@el>C_whD!Cm~jb{^~1Tm0kr7!yN4Yrf%Q zIaJd5s)=1~!ml=!JT0}on`pjoqLrJ}o7-r&{`-)wjrG-LZCd?y$9ru`ceP-@q6>Ul zsTo4AU>1gjcOUHK4aSmrEEdMI*N?(1mVwMo2y+fV{a*uV??Lsy!qnnHNU22_ z-5de44WV%)k3|679|3L#0@(=&TPGtpy^k;8i}`ZCk?%!FcmjdqY5oyE&oA=t`OjQP zlGH@H1B*Dj)L!Z!MM~YI{?Z^RQyMOfktRq*QkhgG&6FOJ7E8;e)zSuOoAiQoM0!(t zPdX!=l|GZck}gZXO4l?^u>5PKX{(9UbkoFXQZ!kbk(zOuNt(%;TFq?DBbp~Q%QPD` zJ2Wq9j%nV|e4sg}`9kxZ<_FCcjYm_j)o2Y`v$mzSwKhx}q3x#aqfO8b(T>!P(-vw= zwJz;+?Og4H+C|#uwCnLn%H7(Rw8yk>Y0qfSYU{K=YX7ahrqk(6x)!?Dx=>vwU8JtN zuCFdxH&{1RH&QoVSEwt~xpmWZb9E2vmgtu2*6FtC_Uc~Ny{>ytcUJeM?t9&@x_Z4< zZ`R+b57BqjN9lX$@752{XX;1l$Lovr75XXqnfeFxi}X+FSLiqBx9j)mU(&y-KczpT z|5X2l{yY88dZGWzpf#8bEex#<4nqe+q@kOkkD=Ny8y~BQj!x*UCSBDe7Vp^Nt=U|B z*QO93HgMzBJ-oF?1x55J9DE#s@@n1gRn=u>%BMN#CEt?VQhZCM5HGD4RO3x-yjYDl zxl1ccsBYKz-uOlneaJz1t9^>Eli1kk9;Fr2@bL$y(q(*7JYIFjXCrd+T=?`#ZbcDZ zo1a9tViJ?oBso4gHyU zi1*zI)l_A$67^SYFrcA})ayf+MCN1-RvDb4BuUX=Ds?c3E@Qj)EKt}osG;%1hU_4P z{S%enWTn|a!b%;lR4GnViYGydoaLo>@wp_wv=LdQ>fJ^qX+SMqX<4rPrZ>Ll?XiJd z=}P;OiRDTPb;?l5AKa)_DS9k#bX`$gU0#&ysxB+dt#(%^9Li9BE2>I!@yb5wRYpTL zODS+EzgdmCaW%?kDZ{&z-;BoHXDiLBl;7+IzEw43v-9!sC48JpWqwRmqh6Jw988{}X+lU7IYa6m7VE6bOl$W3p3emO7?+AQ!3Ljl4sjBs5 zhAE>?Ra%T{=wfO^_8z6>H0Af6>-vgs+(6f-HC&UDCiWht6oXEDOs)ImYPd48OnhCT zpt>FkqowDoK-4he5Ku)<*fRE0ocbxQDKBWl0GP1n7%%${B8S0(VLVRXP z%}{q#QdKfVO_lzrMCp$*YJZd?9Aaa-=ek@KwbhjhM!kC~SIRe0)Pi10K|w`rISo%V zspY+ua(eMwxlZop?WUkyz3#5k>Ki8}fs_i2QrVZ#UBUT!cL_a}y9vG2Bwk69yh(!6 zbsjzpq!!am5gU_C%tq3cXuaN15(zmrCMmf(CIz#Sa-mFtu$pe_m5M==xrs!rPs@S62qdTelNN>^y>qGV7`tJI^h$4pS^Yx|rN<zpZ||{oe4q;P->yWxqfC{_>an4gNv?(f-N)gZ#7o zNBEENFZZwVul1kp|A7Ca{!9Fy_uuZn-~VO*WBzaXf98M5|7ZVy8~u!T8Uu|Tja`i0 zjQx#i#!<#XW0}!yoMn92__T4Iaiej&aj)@+@s#mhQS+G?D&j?aoER$C$kn~&p>n(& ze_kFcs_nv{mD`LFt%Y8&L&7fFh&G4hR70 zVNDV3g3TEByk6WbYgfl~AK)q-8@wZ2w`u>OQO;vtMJo{ls?7`BhWLR zJ^It7lzkny+J`M4yL@xt`t{H5JG5y^)w4r}#C`=2IjUz>X@DtJ=VH4K3x0emyZWrt&-G^my zAIYtQ;&6Neu z+J$DP?#I%E{T+j3du*88NA7#Eqp;h}9+%L`{}wqSA8EemCoT$I{TRJ@>L2>27 z`q*F9Z+>{yQ|p3EYsz&?o_gl7=Ylq`oL1$UI<0idjK`mxV;^3i1AqPQH7cC$Xf#{T zZ94X;JzHP)Krru!-IELU<{0E=S(7ue za-TmkIk@d8UDWfYFO^y5zg-zeNNF3&k>bpFQ5t#gCtI19&5o$hB^HP~p%PPEmnvz6N{FPW^z-(C5} z3H$IpZYQA@umEMcvUnzp7pkBm(G0n{zro4H;?NcnKSp{1wpgt%$>d9k^3K+Wj`(- z)7|&TWA{H1^u%LNKDF3>LYQ@C-NHEw=gbeBw`l(3rgcl7-LP!+!uz%b|6o`)vE=c* zpp0~PCwrgx_8-rHrloxUjIqp$5}^X z`(=zwm=^qXwQk3fm8-S~ZGLV_b*1axQk%&-)@bfC^B2+NlFYNt@+o z5#%{*y~}3#F0=k@SEJr6*60>3dGxVGfsfB$G!KSy;RpGG-Xu0@D{GgpS+jD*`i;w` zxZTsHmfKC2X9|O7_C}*eg1VW6RsW@k(20BG2+!TH;FGZASfsJAtYy|}_A z{Kbm~Q&DBnv~fYEnsTFQn||N2n#tugQ_IRGFWdKo(R6V8wgdZ%x1*Ed3FEhwykIw3 z7aHvYZLvlZuQI~0#XI^0o9WRdk1kmhxOn~|lZ7!$6?ty6t$`^IwqTB?ovWXaJ5Ec=oGc7u!6L)_pKcSx~PrWcf zx8d34&#VvHvU*BUVR=<=lP2cp zZJD&+Zkl2fg~H$DnFyIo)SC_;81p{Z>NzhAT+9I-LiU`uRvJYUJ*0ofR?+m*Z$%KJ zS#Dk|n>vQ>ly$JtZ?t2lo5E(o>6{YUr)#qzCHQMX9p{G7p=e? z2^as3DKt7Qr&ssmqt35cyXeVhgKGwis?J#GcR}>97ELyZzG9>GyVs5!vYDE+k2M~U zTbitid8fYndGE0^FKw-?e%3BeG)$_QG;Ms4InlThcAoU~Tc<_8K-2y9s4CrEYmS+O zU2X}w_{SBvYob|8-XWh5JG{()O`Oo14eT&s8-ggve|ud3N+GrhcO zlkF`L4e$99sk3Y4)~QE=%+T)WKAtlHW0n^Ze1vzs<7U$JFd;JYIZ_3Sl#%z(lb)hu8c+By?SujT@QBfJ&@|3C&uE%pTw_`z@6!FKUoCd& zOb1=t^Or#|{`E^tKXnuulN>Id5aD8pPPXXfaCwQ&RHyBz|4CSN<~g4ZsS)EoHC;@) z_}$lu7vW)Bn3m2IexCa`LK!=c8=5ff-bWYT7mVg^o$1mGufM+il;7$G_pbE{SHBG-8yg z$Y{RCV`ecSag)#-F_PYbpwEB*oNxb5H2+2;vP?oZy;hXhwh&Vwd)=G*-JA3VG9GG(UF{k6svz!h(vH$)BPBb|leWG*s zT#o0W=<%m2Mn@vp1>ejV_V@2&c9`KK28yE=&(dNN}WIl_;g0$#OVabBUfw+r=y;o%7OHw43A6U=_@*@EMa&=1W$Qk zcN%9MbbRrZa%hv!ILMr&VUszl=6FzqcK7!v=l6Sc>_tw8Gp}$u8p7$u3@w|h#XdHF zhI4Qa`|Qs#zJ>8+8ortyXyI!ZUnlYHjBnt4GsA%f$N%-R`3Hl{xY44;2;A3HwpfVo_|6I8vK+7$94Q0IAc4kmSB zQVYG*3nzaXDUwNcofO8Tu1xB{q;5>=#BmBJMKGy1lcJdv#iSS}#W6fqBz0#}A9}7x zif2+H4pKEz7L)oiDVa%kF{vMu`ZN50Af&sQl)&&m29c7ORLZ0jCJkiL045D$QYw=M zGie-?(lq$LgWxeEDO)Rz;?e{r6*FlJlSVUXER!mkG@eP5nUu>U7nAa}QWcX*xa8*2 zBqo({sfI}v_$>XR*ZoUx!%BFg{-pjB?3iEF%Z5RQD#L4jv3^B=bC)mbn_vYW5nVW?*i*M#^Hm%u$W-FTg+Fai}y7^trM>nr(KBxJ-=Bt`- zZodBx(;fCZI^Qwrj+gHE@Qxo^m|C=Lk=`Tb^L(pTtx8*+YhBs;@z%!!`vlGlJRKAi)FG&M(Da}MK~J@5+2*b`g>4>d z^L3kVZG&yIY^!a*2lowL8GIu6Wbn^+hkc&?nEf;RpLlR?s$-kulMo)#E+h_*%gqeA z96BxZvCze#heJOI{Veo{woz^K+fHx0vhC`2QSIW}Wwl$_Zfm7**>bhyZwXh zSGPaV{^RyPw!a#t4+{(H8Wtax9#$My6E-L8@vvoKo5EfVJ0A8?*uTR5?9i%1`wqi9 zh2Xt=NIkxkd&QEk+ z+S${kX_t0g61z<3GOf!KUET^$2_G9iDg6HM)#0y%e;?r&5g9QwqB>%6#I}g~$ZnB2 zk?zO^kGo{(Ig{CKiR2~J5&S(Wm7O8o%)0QZ1523#CiFz~T~ zFQwj@T9djw_3hL@2lXBF8z4`nv1Z*A^v8-&G_cmNB`$SV)kZZ}#!6FX;GMfVTI z9U@wUO%SajKD8fwG41uN%+afdKArMNYs;nfhV2h-nYZcwabsG&nfdw~yC-fQ@zl`P zo8049-V-ESI=7cw+by5TfrvkXf`wK)XvC4zA02+_?bC-x#t#@dVxZl;+Bn{(sSEH- z5C-`>F-9+ff7OXQ4RUa(PArj|$UhnejL^w<8s0skGs{<3)$nr_wsQdp&fnG_Kd2Kr z!_aX$@sbj=%NGno$LnOB;rIcaxzH%&tBXTzZ~eKvozXnWC|>Y<5NbPFU)RBAKA3D1 zTM^ERsaF?=*`oi7u*P8jN_6mi5N4CR{1qE+d}>tqWn}h5zM0GO)x>w9EZPi>Hm^aDDcEvC}BG z%qglVbJ@jQb%}8aE7MnWBHd87c8B}bps7M@9W(KO?O@QEJ%b}V>{Qn{DDOQ6opye_$P86Pky*Lvg+Bb zE_y6m5|0|hclB4Sna0z!zUW%>eVr#24gJ1B!vT#OKBP2U;%)d48hVP+@Eg6Q%Y|bG z%R_ZJVo9vQ(&c%h<)PKK`nao)pW&x|(46vQT7U4w_190GHRb*ZL1<3^i~6?;{wUu`maQn9=^`pI&vcsDLvy=`aUTccj>HDH7@y(;*NQr+`U zJp0^+p!LsAb=S<8GSNP|ABYy zJt9$Ad+%Jba;3WVu5jJ=xKX|=SO0rEudA@td8D;Q&v@)3{k2^y{FR(}0j-Xeu=AYQ zV|Cfg3;ytw@lQQv8gW`YV-*o{#QF1b1j6e`5z(Vgj*ug96%p54gd-mzhkxEfXNHZ+ zKg|?fJ#W;uI3;?@A&8VuLqUgGU)OICFY1I__LtoTOWle3h1P>RckDkW{u3{HIC@yIZUd^;FvmFmuW;4GEO&|P|i11EYyHe( z;$oxaNPnB<^SW{0KV}TJ9O-eOi)a@7FYTD>9WUE0pC4Ma`^6X56pg~2G1d8Fg3TYp z$otlK>VIf4*O(7mZ!R>mg~75{tet7Cdw27ZBX*1Hc#=*;=w-X;v+3}%cOE|3dZKai z{PNk8gCm7jXW4pc&(Xtmfj=a?)v426L)&Gq%zr5}*s{0JgoL4vK)GpMU(q7ivi0Cq zKkK%Q?s2&l<#|>1vK_81+XHv5TeBm$wEk(UWpA2u=do9I?s#>ZUEC>mN2etvc{QVh z%=PU_+7H#XI4Ig$CXm1_s~~Q9!(!We!l)5BasX{u7roR|bP*E+#l(xE*S^ESvY&on zpH#VvJStGW=cL@`WS?NAjp&a?FRN`%o;!(^(mjDtGp%DmdW*%jdp%ET?j%`0bOc|BL?;i=7HxoD~p=P>Dwc}0vAaUvm0WXhxD(K+%6Y;fHDnw%v@VP4R- zE61GJOf*?9TK@LyM!7luOck;<6joM?wfTl`qeQWAmcHkeeU&vNj>X+3W9ZR{o-K(~3IUe-pwxVGpoW(=! z=`td3%XeRFACo;`c*%gA5$oQaWS6D!x{iD51`BhL`C0gl&O-8})p8GxJ2W0^fG~>A zUkRzJCrxgpm;YT~uIumdGYCm5PtuD?Vz16zMkr!C1DrNsWi%4Ye!pw%6C_~!dLSAl zbU#2Jo5Twycey8j#K7){$kL32lC?kWRB>Xkh^yE zMEigUUFpu##X<@)SI{6}tXNaaPr)o7rOw|%=V6z>6@j8nmL-sey9D1?;`Y1w+h_=IFjNXO8A3CJoQSgxm$v{Y?0AkwCpB z1c;{kheh}i0W3v=pYW@nEc=P?4RQ-PIZf{WfIQ33JYy!jLk%K=-a>-kHb)|g7$urS ziKdoc#3|s_<H9ONTe?I&?blj~<`MfpTEayBx{8#vHB)w)~Pjam>)3 zfwJ{dwCEgcx#St9%`Dh?=*8VzPn_5@arBt{!c4p67x^1){KyyHe)HwSAAa!4sKKej z#wOT_AO2vhzo-D-FG6b{6=scy!@x_Q#CBD(SP>|q?uPQ+Er+#_mD|XUOWj1^$%Cuc ztO+iWBirV+o$n{CVx6`B=soYheR$tTAHJNMntV?l0v#9^BEumIjN&{jO#YV^W>z1z zv_^cJW84KR#GvP`2X|oOwrKmfaq7nHL3^M2R4Yy;PVRc;%x8gbIJb6Gq{DSQl*r-8123`Sl$k$Jlvvr*fZ~=pb?t9;C>IuSZDu1ZOl=^}Vhas0x zPvFd?i9sBLJdepHo!r!5mhS|jp0PsHVx{nZUUY*?_IDdCmqeP#T5DXdhd=8xPxKBH zI_%jxWLuYRa+hE@lymzIeRyiSb0p6FP9MceJ`F6(AZm@sdAkld@?cW@{@v72fZy+qdw z5wfwHmsa^%4vM?# zTZ+3pEuLKW^tLC~w|-#C1Np8%%anRQgZbQS<6}0>RsVp_HuL47gtv08Lg!Ep+asWM zIs6tD9gSBU%W1{Y_Z?xp{71Tw*RPK`t^4TAW}*2#@W%7_V9P=8k$mv&j^s1$O>mC3kNhMm<48Z< z!kIH3xG%^|+vwgs^tyluqqzz$SD8a01Z=*;y}U6KtFEF|Zku_8jh}-waOME#4&5{f!50mn&?SDH@oEm0WY|4J&%81k7J2PZLf+$8ZpE3L6ps$U_`j4C;*mX_j;s&b~ux5udK^ETo!Nb zw29+z+pW%jkLN1-biFJ$A6{5fjs@i-SWphvS*H9MgCj)C!QF<^b=zuR3Azs}%5f8y zZK<(~62qEjx37OG=>0u8VO^XVm==5oJNz)&!{(XRF4xBqn#ne(@v}3nuk2jDc`bD4 zJ{&U0cU|Zttij8Lc7`p(#@)shFzMY;T%)`jvtq=RAAjM3gFnbyh4zZ9J+2>YGtaas zoh_EfSZCQRpLixvcz&>xF&k~7u_OOco>B8rK)x~4R(}1!vd(*8DTn^K!)iI*!`S~G zBmbzvmX9dTw+B!LA3UYlh7*Iqm}UT$m#+4tje$?~qFvn4kknz-qe_BbsvNr}J!trZ z+JbUyL>y8M8V?vOFP-1D`}phY3;G1hFQCZ*!}*=NPbk;s>|)z2Q0oZ_m;iJ~ff3Id z>FBw{hTV`*qq0Zx)=wQFi<4N=TXG6%NpJaNH;$Ues0;c`&{wv0r~6pYG+NS^9I(9* zbY{1*q))Q@_(9Cwv3m15yF3rAj_NF*Tn$q=Q()NaDp@%^NVazGEcaKQn`mZVhK>^R zk6r$5&zolsY@Ir3m0d12xTjC7yeG)qa2kZ8pq(ED^fp>fA4OMYxzo%m;`1x~6?jkt zRvIy9CN@9hhiCpKPG8}_LsHcMaLkd)nL?t>-;G>$zFWQhsfPLeWcpKxgh#P8dC`5yA5CaHD$c#OcuK zSik_A{EV3Mn@3yAg${&%0h9gBkn(8Bo_7OJ8|un-jd(iv<)=4q{|Z;{ZrgqOvEbhf za_a@%`pc1l>4pi@$|eT8L)YlHE-N2zA7YRrzr0JdUWk>@Wjvd&Tcs@X>&4V{jMk5S^@)fKe8X^H`Nl25tADH3Pnx=Ezx|{^M0WjHZv9wrsNwX2?F9n@ zQw&`<6(5-qJYq(fvj?sQ6z8X4patS7(T{(6Q5?Fc@x+Lyte1D4t1vsdY)B9OSpQbv<7XVV0^#(Ux_TPUFJqWP=iIVU>779>veIDJ7pm zE4>~iC_6pL5@i@)Sid^w@VxLNXG$ZFQ_sMc=k~l&!7u7t$_qO2 zJXt_qcA9Hl@Tj`(5INltrIQ!44tS-txP-Uv z>m=i*t(L6?)3qmbTjc4GI|Ai_FIdf&;yUJpj*b&5lswS%>$Pi7er@x8ox1OTP^a$o zHcxCXoc*S5-Me?w=H0tDO&L9U>SWkCKuGX|^~Y!;sC~>?!^T7YaDJk@vE;MkYwv=d zDwi1lJ>K_uiSgfzTfPU{F0PWNIM>wInckI1 zagLQ^?MOIXsklLkx^@Bf20?qqZnNdCTe0J)`9`-%qOOr28w%(ZV)vOWb5q|TA^ct~k%}i_a z4%!b7ULE&~*IC9)?``d~VwZXK^5vUStzXSLGkdgo?t*#2QD{h}v#~5!{G3F;(QK^g z*2VMJu66&SWs6=t+O#>}>$c53MZSw7vsmVe0S^|d3|lLGs?DEuqp%+r7xI&oGkT?6 zUqz^1|AOMon#Izv!^(gcEc^xQ^upr{NHxC9wH3so;4dih32nZh&)b`O)@lqnwQc<1 z{(ch&*{0OktTP5b$o1*l_MOj7EjcYAK-`cICSznFZ%+p4tJ{it*@J-Vgen>AzZtkBu8a-)>KxXV`D{en_@ z_7i*4PD=U0^xcu&=Qr9~Z`971Hz#niSD)$Mo;$PpyNla%LZ;=|uIFlx&Ka_=jh9k+ znBrEi`T@uvupee0<_kAOX8M8IeqaGVXrRB?f`?z2a6|d5H4}CD&dM()xm63jw=yGQ z_JTFuY=*W)L8~9wd|lS;7s})pY;xvmtrDV#fR0vJbDwIsJFI+eqs2W<4Xy{(PBhd# znC=m@c;CtX8ulscVS*W`P8q1%_ehK0hpx76_dTuRq4R5|RpJyK8>kxvrFa7c^S{Qo z*0PE^_YIOL+t57<^c-OM1zp0^tb#0JwCVG(cP%nBQ&1emfD(4V^s3)9OFj&NOswkb zyRdbx=Y3bPR>P>@aNBo7yPi@+FU3m{nk)5`x=d)!yqNgasqc>1Iv%?0^UABBA4JFw z{SI8ccIv?8D<}JR-)-yR=i9%Xm)ys*-GI-&@Uvaqb@H<-Uf+E-qD|ZWBih^CW60bz z1nO4wXjFA;eMp1#?dsP0=)Nh3l|g(k10gZEF&UZ#)&g2(y>j+BJBx8Vy}n?w@`1L2 zUb#;i8cLCeyMbWxWY$jm3j(kYw2EHO&el-Q*3>H7DB#Eh*16%Mi;q|lRL2X*AP6XV zU}EE0kyfdyQ)(&8l-g{WRx#_?I0b&DhOAn5rJBwdh#QFCEvO$9c$?X9|46Z2WVT0o z_fD1(WXy(fHc}04hH5E+Sv4#TEN#?P)|z!;bDJNaxs#cxl1di~q|lLO~U-e6MwX$ZPupRN9NvEONHuy;jP< zS#Y56CjPoVhC1Chg}q?MSviq4MCmIbOeRG49VEIhd!Y@PIuoYDlf%h$IEm?5xq>rF zxd+|!&_NFB;b(o)M$5{7mBXsBPUelQlCoCcYWv{3U_xUR?`Qc{pNXsySWJDC^z7$r z{%Mnc(63vu+>yr`Kh{87yVLZTt$|g3lbnv-d;?~Tvu%aZQ&|61ySFT)XYj)T)V&*)jC}HWP;V*xZ{*`_vBfV5VCk8E>=MVQnD2ZN=>r z$#{G>uG43Yn=_2e3z??XO*H3M<>m6q5$Nw7!2L#a_99outlwm2VV=gT8}OJhCuPPI zGxUebFs6}*!4Q+VZc_D!htWvCWJ_fY>|1xjzEw3%9kqS@A*gW|6kI?xeSD8Ku%U<0 za`f=_Jtyq?#0v6j9mRai8x_~-dT1?LrztJWithVn%p3pXi7c>p_|Tp=(*Bgyk_Bi_ zcS3s#+u8BsM~>J@X|Fn6aMr|T>!)GJudi;Zazu+kKld2K)rxXwkVa?La;?O^fWlPE zUg_Msk=7(!BX5VMZHc5bD%kWk>qb0@^-`W{e?j+U5sV3`^X@UtvR{ccG4tk&U$H7? zxh2y+SG1?~Fk0S}y(%_zhxL~|QtJ*iFBkOCcN^cWKl{Gy*fR$JBE4v?*Hp|iIQud&pjWKr>*rbwaqJB-Wfg|0+z!5>0QP5@fkkVIb zKycZiVwHTv>^{6w`?5Q^UTJN0|0( z-Lh-<BACvAefsHe<3d%SLO5>FBY#i5CK)@H73keUsNO(}@6|QO^9c;}7f7X>% zoxlte)UFOo;2qM3N(1!hn@Dq{L~6P855IZ{RU*VfH;A!v#V}LerDInP+TJ>&9WliZ zx}a`j4t*VLW3_aaJ_!xADAA`=!Qgv@uVHCi|3ZS6z6UiVFH)(HIg zJhV8Q*;b8O2UkHdBA;dO;Z<#wpOsaMoTT&B<%v102mgtcy<<@dwK z%KPeYGAAuQqD-V^ahG4DNoW4atpB9${U-v<20983y8%Hp958(e{kk}^*#P>h!ko0p3_9KWu;tQ!_HEtnI!OAq&C?syBk-r zhnLxHH>}=L*b^4B~SI z4s1L5Q?9LruKBb#iFdtJL~SC1dDXsFlV5n*%2+q!(+{JrnmYlFszj~;3s zmN_bCg0*AEAK&@vYwg^f`@@fVF|Bi_p{K51J96sV%ZK~5X*;YRwEPP}IZq$+VL#@Z zzq+4=DQ`rOSqJIs$Hls*<7k8L_aog_YGEh49;=&l8wT)g2$}i$DYc0_Q+T}N_bFc2 zN0^1C^L|7X;4mqpfN$e`;awchl{$Mm`xQo%`~_HJh@8ns?}p zmlpbH%PJ<@PaQqf$K2!S=*w2+gq*;Yjw`b^rmd-xIy-AxMgUhjHl$ID44X1pVpi?`T}$4;C&aXH7zZt4H-^iJcgQu8~<=#6)<#>B9`*%JIKvLF6x zwr6pLl$(-e9x#^%^gvCBo?>-EWi8m|sk*}r5{&qGA5X48#9y!r)o_4ipY-WE3#tE9 zY4r}fN_|Wvx-bMn>n9Le??7n%1VZZ_yU@Dc!lEg@KPpH)%UlbqOA$yd_m*Y7rMN25 zD_KLe1xmTMERGRaXtyxj_>`)`tNi7Sq{5BP^(>A-AbJTE&t7`Fg(^zHFNlgn8_~y| zF3eFg{E@!xbirL@=orRTXVcJJL>XccY!ch`!1!_L@!S`Dik{sba)yOr8iw(BsllaC z3@#nF4=%}r@+Sn?)J{;!HN>E` ze&eihD+hQf<(t-n%-8sKedZXo3c*wo4D~3Jex+$f*Y4~)`R&o|GiEQfDLow1jEI5W ze2lSW)`TiYN7Ri57~J~$v3+=}9Mucfvd{3VEJq2$R|x-zMl71^Op)7hR&_UX!GM|_`-nrN-hsx# ze?kR%FWz$emUmLVg4+}p}*60oi=KS54cWiwTiTy%VyC$z(7mJV~om@KK2ef zrbPFX&V91^)2+7cE4Qy&yQ%&6m4{f2w<1Z%`&pN~CUK)HMUtbO>376K^-sy*U7+O* ztGWz5u;WMrbzwAQ^s;G0OB?+qlGL@V+69y*w2Q@82{Y}Pp*6m#52bt?i4yV(#Mo}N zB|M=c)1*9(MH|%LmN+@*gLtcRauYc+yv=0vpiBPKVqPHfOg`C4NpTcruKYb zTmdVyAl~!2injRSEQ?|*T-L`jM17B$S$IDQEw$sVwcr-%?~|!vBGZfzs(LTqh!o}N z<4DUCs&uakJE?)t42^xXow;pC`&^&?c;CVl3JL##kI)<634bs8)jkE^QViuDZ+KwE zF(+>sAKsCl64gUFeDdhAA68jm(SfO&dZXNB>d2u~VG5jijG>s}Y4aGDmjXHUC948C zb@vv`W%l3VH&&g?yvt_%ZCK$2O6vK+9VheFTjh)u7QOMePSkQyd(Y*kTdXQ3Dbl#o zQxq7a1+8@9@;(+H61K)ry@)GJ>tn(AhcDHN_=3w+Y_Xcr#+7t77e^GAoiM^~(;Y3q&X)0u=C}k4vx*WA|dlz{z zr=QM+KR37RvoJo;g2DBdrGl`d)V3%ezG+E8_(+Y?;Y}BWIGZZv`@jhPGOIS$;)kIe z(0P5Sjr2jPBxeMCB4x8`#;0Q}7_3e(8D;*`__U4G3_Svj*~>;x%oPhGmwg z4gn`>*+f1TUqk=(9W4xSPz}I^bEyao-!$B2p<({~SYHXs@67zz+LlglYMKHp?p>m# zJ(#U|3#Hk^s=*>?yu>=b>FOwvlAkK^2?A3rDQ{{!d>yH?kL}1u^21lnO|#s96+hEx zZcMSTn+FHNJSYLmvnH@;TSq4UbyzbsgI^2U4YVksu+E7@ftc%Qyr4K4Zg7N(m@ImmRl5cA3vLjk zOa=bzsO_(GWL{@yU?q)>tlDPOpzEqV!Y@eR`b0@-T##!r-d0h4y^VCEvjs(v->2_m zm%(()7U31q8EXiEq@)bYHo=1V2_EPfW8(jDwc{)wEEomV(U&@!VPB7C*iW_^ZzIp+ zclK^OcP4kjdse#%liV7LqN7=7RvbR+viCsNnX~5ne(DkuNplkC{pk`C%i`C>EwyF@ zFAB^IVOt7XSN7F+pEy+!p+&OWT(Gl9^l;XxoWsXl_U_L(^SPOQn*hFn0vyCg-_iG& zFs&Mbqkn-G+R?xGn2WV7-;_iDg7kV{KZdD>8*jK<6#7&r1&pKRi00$LdG?m$Ia&@i z3bh@bbEHmS)p=|eZ?~Vv7u>Ecp_6kyKkXgMC`drw7K|STP)}e~!CiW#;+upc{^}RP z@+o=+HU22cp~q*Tyk33%rscc5c&%=NGN5_9Df{M6Hz~9}1VnnBRc`fhoRbdOXMM%0-Q&|%8cK>- zSl&TfSd3*5^SWuDK@4?cHN^x9yUZ;|?o%4cg)2v^Oo)2{#z!tZfM>41vwbIEhlICZ!kttiHqam1P#ZIAnMLnn3Y*#E$VsbuxP zz1F?1OuL}UfbLr3?M9G&Vl7HNZpzT{nFmZ|9zTMCq475c@ylc^z~DI^o@QP={*(D> zyWG~BtUjv-yCc zgWY(ExjqHwmb>QP94IN{3h(~Wj%hUb^>S#6#?hJw3&3RMV_5S5cH~)#o(+ap4y%ta zNm&j{iRBP+oE6N|g3VL}GH`zO41*#X42lGoGLQ@A2q( z4|{{gInujeeEV50XM91=NRD#Y8w|4SBI^?*vmP3g4LqG9q%#_}C)Wx;Rny@?kkS+c znFUs&+PvhFa>eK${;Yth>1_+g*FXcbnmB3**k%n2j3kB;M>U4rBQeNP^h>-869>yt z=62#S8e}((>=q{-*#7B_t+q!yzxtLnG0T6s$kR}wx2g-R={jF5A~;A@DY*CNX=2XK zP}sLI*9VVDFuyI=P-Vlz2X>x(w87d7MbI0s*O7+kjkmi@88ZwD3F_~l*d<+IUhGH2 z0fF*nrOVBxcD9hUs$JX)hqzu#nrx9r5W7)PzsXj3w*hQw?XwiwRNg+F zMjfZpw9d7rLY0GhgvyULFd# zt#OsILFH`5kzli{+DL`&umr%%19&MIKUJnpLt5|2MYmf#^!WT&*5nD;-8UEpeZsPI ztWwtl9}FHFIC+-Un7g-5!F#{z@itL^amVVz`?k&KWp$r~QLrCryt@W$Vy-|9*$qZ9 zFK>IwA+RNQq1(JZdsF5%7uNKV4(f(_y7+Z5tD;uAuy^tNQW>m^%8tp-A={Wc4~~qU zx%>Cu;LV_LMYU2k?$AlY@u;~RdX%M3`LlQhfaorX7b5g$*TFfrK0U2YZji1m9k z`62Ut=yB|c?Eg>Z^8_Dt8!UL8>Hf)mch}k)ZPNOM&6+*hYrw>#SFdhAb~<+3tzv0S{O;arUCGzfbsul-qMm6_|eV8$4zKYe2T-W|4y zH?>n|O`Sj2Yx=ybLpEmAUpv8^?y%bCU%P+OtdY-P&&k`13 zfYM!Q>xDTV+N9p|#X zcW?g4=K*)lYneCNV%*n`rtO9nxXvtU5h-(ODEI$YM;+?T@mY4MfwK+uvf`aJCn$&ymc%@TO@mo;7cL0485i9jXTkfq8xPL< z+6zx|I>@+G@sqEj_z1*{ua1uhLkB8yk72wM~sJU<+P zfA9=k0>35j3x!`O{EW`t;m6yW<}I0@y<+jw<=J7&0)s zlz2XsIA=vDUW8KME{Ucfe8!5!OLDT2a`61nV5`x)qEKLLOG#6ab5?{cMv)O3MGjJn zOevtqlyo~uP_hOimH8`{EnAwC4P*p{A{Ev>o|49gAiuE1_z(&m?kqG3;{L#>nlkyL zX}}tWsiLw3@~2WSe=76_G%*fot-w~UsMF#- z`K0*3u;7Rhd{Vr!CgHfn(+3S<$k6ZY(hnPK&q4EfAo=ILEXw+* z?NZb+>Cs1*=2^0LY~QeQ=g#$WCr_9WG!Bz#7qU&;Eo{>q%Z2mjmtWv`?Gw_S<5hlk zspGF6=N}tKo+oo7T5rI(N=2@5B&|81tYJHgmvQQi;k%t|(~pn99zEEYycT)Jhu|+y z9qi@dFa$`Fo$j&>Od0UUvQz#@^{3k>IbL<^CBiA&R2r#R%&aU68D}ZR7~8Z9#pXEs z;lpDYQVqpMIFpMAW2+t@Y2fTraD-JHO>86K$uEFaS5b9{^^u+$E06A`gWcr2de}UwgM*EvDFC6W3b+2;M>)cx$DB@-puszFsYNoOb4~@v(LzT z#5M9B4HM3opaZ^qMse4Mr6psr!mQ-XWy!Wv?4&knQBqclIWsCfA|^6E4$F>S_)r@W z7aAXKj#wO>6>VkZeUwYeXIghwbtgn!AC25+sB{pE{`Fo&6D{T5i#`sO+-J*60(e&P z;WMVp^z_WsxXidkwtnn0?b6uT%mrQ%u@PYlZ9YnQ1?6b|E<=(^`M%l((P1$W=I|v5 zZDq(gJ|iP81w`+S8C<^fT?w9PX;|OShLvSEm0H4Zv1C=M3|}n6tjS%sxS*R-<&ZWx zGBP>ZYhiSBR9tdYY9yj4o3xRsX|ZWuYWWUg8rZorrj+!g#0(q5Vvbo!i<1_aGs99A zq*|5opF?5!*}FfWV3&PZdF|qbF_{rw5it?-<7^)S0de7R5z*#|jHpbQzycSWfeUt% zy=4lMM!>MWS2*T<=?i*=A7GW<20{q;l%bq(rn`l`VCSBTn}2Jf$*(mO>)?543+n3j zW6jd07P+o&gyN9|V)V|B0VNK?f(-FWTa*2>`+R7jZ#9n8%I{#I!4bnGr4JT!jLyK4 zunQN)M!VHidMS90jE#vlN2NxmVVTF|3@h_Epe=X@vy%6>m0zVb>VUxAfeK^J9* z-u^!-%iEECZ}dZ6LnqK5qnAIt*2rV?hhYk=QlXa8+cu?CvT2d2YO?f~%8$}+)-%Ib z7yp^}O?Sm$Eok#vZleeO-JdHBkgq+_8)};QOXa?f5+hn~rNT4h&_Hp=FGW-)P+Y^; z7xSKcMTt3brN60uOmF&_*;6GZJmsWzP=0KZ_dYGytCK%2oDQm+u;H2b>od8}Gfn>b z{Msg3zcev2DoI_xG&(7QuV4BZtzQ~J>z8I?{nAsId%ewX<=_EWkD^W;r5xa|tla18 zKHIa$+VPUMug`>*&CHmtRZFP_^I2Tsy4>>re$Z(vbLY#YrqFV!SR2*qevH?V{HbzV z)5(Hn`jw~Nmcpcf(^|RN$%3xBuw1R&|73x$Zpkh!f)Z=VpCXsTk6zhNThPo`?y6fl zR$DN@SN7F~j?)%&^_83H0zRalUX`7FB~ty%uP-+>1)bU@`6=b*UeMM@ovNT6Wmy;< z6SokoY$>gvyf8MVWCdmNQCCn-OOjYc?U%Y0{r13?%xz^a?LT2UsU}@q7PR@jwP}$t zNzqb}(R=FQS@XqnG-Qnu zo?nG|W?ztJANf5K_<6>4R~b_GhOp4_%R*5tEs^IXZpu z=9Kj1$0M?`_oQF^B*VCEphqqXi8igv-f_&!*iNV*tjtNuS-yOkTXo|qtcJKYa>6mM z>_v$g8MZC!a~7}2%E_#fleuQ`a`WnuabbI{aT)QM@tH2sQ3(-IAAOcK*Bs&>wIIei zJ!1O2IYBOwk>Lx&yygaFuduC7%~`oFDrcp6Nosc1;*?1XS6E}y(&AISRxew*B-6HP zX>xX!IW->68ow%fWz;H+==Tu4=kE#LF>RB}*u8-#KQ%Ac?+d(B{o^6idyGpQoIKVV zn;08wj*N|15NHjZ7aBM}C?+~4IyP!S$il$rpalWZ0igjd(F@|jBg`R5F-g{>#I!|T z#_)PrMDl1`zje070T}_o=9#l2=SD3|Oj>9iklk(Zyi}Lyq`2f%v(dW(mYH0%XlZuX z(q(w^#tM=tsTmNQ;lDz+V)@eSl=zhRG+R)3SWt{LA|A$su`UbZqZWpTXNCotjp2w9 z6c!O;4o_XUDAtO=acTInRk5oUx^T2dZaWl|?5b>O~;tibH(lq%6F3)2YMS+R=}7AK@8WhcAUiqRV@IJXnxqv97X zG)E*xrbJj%qLZUiqFv&W5)+cVl9Lis5^WjDX({ITG^A?Yx^&C(jn?G!a z4D+HT8`76r5h67$DLyI5oS2l9m}p%!RU4I(7QNUj3ldJcZE4ohtmWx0=_x6RY39WE z_@p>5;x)1HE};PdVROBVu0lIueq=^wlr2-2k{p-pwQN~x+EUw+v}LJFQ(cmik`q(S z$?=JC*7*3uc(1sqkf=#E%(su3?-iwsicUz0vBjiBCoWj(g1?%KLL??8C0Y|xl2THV z7iFX*Wh`<@O-@KoHZO`<9*&Nm5H5tphDX?p&bW(Ao}Xz=h*=nmj$1?pVL{Bgv}~-< zygJ!`esp3&sx3ojbOLFor6U~Z;Nv7jElfzUrKBV+F)xW+6h@((+s%s(4i8+Eo*7|VvT#kpJabG;Xk4^)p*}Kc zLE1v=^4VFlQfIiVpSEbg$L5Hn(99)^(v~D!6Vnni(#(729-g(uY8;8RQ+Eb0?>f~S z78?>9VNG9{6_*;}k{lYH7UnfCC?X`z78f5MH#2rdkTouS$~<#WOiYxoH7Yg<(p*Yn zsx56<($b~o^tkl6xG4JS>7gUTrw)r<9_bYu9UEthUmh~gY;*=;Ma4pF;>8x8%BxJN z@o7;hRv|7#C-b!*7fS>hK5OiZR6|BqpcEr^MP)@CztzI{{5*G-0}( z5F4MM2K5%w15L@Gt^^QRmH4ndqG@MIRrNkQ8T2j7f@3jK@k; zCoF>1^LwlQ3;-n~&F| zdDEwb*%r(isW^r7cd0kAKf2&CH_O$! z>b)X2*912MbC$3yFLO>xa&u#@scz-i>Pq?Urf-buHX4nA6o0G>`w~0qju7WzPufCk zAJ*1sA~pxx?z9Wrf<4vfG?HevW|?N6=7{E|MsYSfTb=7UH*xOhJluJc^8sw#bTl_P&=ACa?9l*HraUTlJ9D8wYb)Dt?$~%^#j-Lu7h1CVv~)zt_xi=U01kn zbIo-<IYk3rEkMhjAW4Su*N4-d`z0d ztcgE2&m7AHlQLXK)4*3|ZRXR!v!-NV*)$Ww(Chb@YNn3M+Wv=eSu7j3E3Y#%c^TSa zMMJqu`i7JhNjX)Lf>HuAreWSg=gRPZi>yb>=~@&tj`EKUjGI>_Zh7pAh^^JJ8cQu* z&4R{}lVeohm=z1RwvZcFR?6#8NYj~X4{Qx}qbHB;-OGR1UTZ^L)6?%WPphH%=*hkN zj^A;IZxx_i)GLke4#+!oaOK{uRs*V>^JCV$BR+!+UMQ+W-qQ0YEJx;VGx+P*&KkP{YdKVGMz(Zaerm$p z4((a8ZL@8vzRRe|O3ek<2W+&d!{~F5un79)gWG1!$f1=TCeNJ|G|J2U^x=)i&X|w- zZyY_=f9j~Qn`i8>8oDVvqvyuVi4Cq2n;pF-dS!dIv$D6Y9ee|#XLH|})zPcE!*>$4 z#-O!F*5nV+D(JSkDPJxOjtS)}HN-5z8a4*@Wo5izz6A;B&%3b=thNpd3T?m)N*x%- z9_^FO2Or$Pe9!*Rl@3+~#`A8N4S_Yjef76i4;uE-jG=98h8~jNRP5BUX$p3F(AKpW zp6jl#O{pt0wk2m*Nea%Klp1hF*;M(3j(KCjh)Gzl-oUWjQkvYBPvq-_?sX?<1u&_P zr53csT;(;8l2apN&~+~nu??nXSngd9>l`eYrpEwDhLVD{TBfjc#mFr>uF5SuvCcbo ze9^&<;ry|Ov~*hiwy*%6rcD0;3tQD!3`ZJ$-^*&ek8Z1;WjsN+=0A=49wr6P_PxfO z3e$e?+UT%-(7Z8r?fClCXJ3EQ?_`(G{d_xjIo1Cg+b!o=K{;3!Va3|jD+6cF3<#QI zGnBDYk%O?z`f`VTN(c;ew1&T0eR57{&?H)Y5{v1x-MYNv>kjVT5Ein^n*Cb4dWQd! zv0fidoINT488|lXILkNg@E_{)fCk`>-GflThF23rq#!TK78|jQwEpBW#|U0FF{{RYt)zfx{I~@V8xe z#!fLVu*`TD&T(~B+~NB!W`yF34La7aUM0O7L(?#aiMByqFvXzsF4j|E6C3C$NZ9|q zp2A>iXE9tlYEehKv9Lb+P2DVp8>;KHU%=wg>jmJRw^;{wXC5< zX$;u z|9gY@qWl}NC_fA~u_nBZRrw6N4`Az-k1#8=p3U8aWiOkA)ejnH&7G#bcwyI-mu3Uz zRiR~^pl4ZkSU=W`b$FX~QsQg|tk2Oiz_4m4sQRssEe36DM#f%CdTMM+Gaz4%wcUP%l5ls`el-jD^$XnC{MjEuWvxo!G*v9KrLK2@+e(Z8@RM&Yu8EqQ%-Ud|EQq zDr48KgW1b4)vEWHfgRshr&<{t3q6gJ94kE;)RlYXTPU)9(bXZJz1IzkuFm9(u4eH? zSCSasYlU@q8r>Dq@+t(Z}L z#dIzGC?=GhI5P1AOephJrkQ-EYyf&-fM}3!n{u~q+P7=U`U$qI%`4Zg%o(%3@`uBw z4fZh)*)nY}{@75MeJn%0A6jq=yI?e?ttG0$5*yn!xEYQCL&|P-LYLwu-_WX6dOEyQvbo9z3Wxi&rqy5HjEFPiV-Xf0sUmfwg(NFU|{RlO5bCUlUYBwg&N`7 zjs`<5S7-uN`8Elni8mWAK%B z!ZZJ2Oelh5}s;eefACO%lp8vppzFfIX6SSL$7Bxks{htt#m#2GtRym2IoRBA=Nj!(vGQkD@uB7?gU2Ar(5Inajd;cC zVgO&QaE~Of4_f3Iv^{lDNkKz|8^h6qD^Kpg)?w?c-Ld;?_QZ+lW4!wI#`J2#4g3T) zi#G6i(&FjQ&kZK5hckwC*4OevMi`yX(zJQX_xTHZ<)acu$c%NPgetaa)RK7^EmdBa1t!oH60ro zV4rh0!1n|nz(Lr_SQJKKiwW%A04EB8*z;b*juM%GYiWZEVK1C0d?K6x`~o{yh{84O z?=E8RckG9N9nlK`i$tU>8pH~KM$rmbO{@)APka~fJ+U)jH?c3^hvHDck45Awjux@$ zgg8N*0XSP+2$+ODD>ULt?8mGTDx=IU=&jQB0-`wFejSFZ6E+&S1n7kD*z$shr*EZG z5}s-hvs0H|zJj~|sM%8mZ^Xw@RK%|aY^+>OXeGF|AJW-d=+?2lueUI;V?RK@p6!Qt z3p0E7?d2_m_vzKiTS)HLx3{;D?Mq>{V24(3+J~B_BLav25USgsoP=^HZ4LXAMsOFZ z2sQ0b&e+P?EYz|;Y4JT?*w$H1MJH4gstR@NPkO-v|ERA0$pyo`RslL1o}Vjr$+ijg z?N5?m!dJZ|G#E2|)^t(gumXpk99HG9I)`;RY{X$R4qI{9j>9gK$IhH8_Ttc&!(kly zap=$CYz{*>jN&kn!%Pmdr;M68SzO2A77lYc+|S`r4o`A;mcuVOyv*Ts4)0ExJY}-@ z6Nh;mKIc&8@C`vHXAUI}D{$z^VO0+CANarj-ym&d;e?d_udgECH~fEtM8Q-K{yV4z zwN?T(H3i+P^#uEe@Gos4Vv7*eGQAk=tVvNL*j^ z8;6D92b+ot#Vts+x))ze%Hx@B*6F8zsA&~BuMfXseFN=N_ zciNw^j|@F?->c$Y_-gQcRoq?l8=jC3o<2e7$Jm&LI4<6CctUWpd_kD1R=Zj=gwmky z?gP$os8>MIa-8GRfZAMJXn_CIf@Ae#Y~C}8^W6}>20f&cbi(d#0mXhYFfT%Q%)Df$}kHx%XK{wnu5h3Bh9`w*j$hg49C z|KdPS0`e(DuJ?<6#@{S;z+c9f-~eWXqDPK9+&=*h><8k#M(o!`c@*mJ9TXm^@DtyG zE1n9~xO7Fn_NPBf&mR5>l>;Z0Ef4ws%Q*J56;KyH)Gx(XR8dny8uYc#;L6~jB!9gB z)9>Tu{fjt`*hSOI;8sI<;P2g|_qZZuxD)&dU&IfsT2lC}t&%!dT&_y|?_mEhIzR>XKY?$!!&AKn4k;9+bIAXn{o77C zLL!=$M^-_lQulO==c2E1g``yauyX~<<7ZIlIeO=yHF`&NsdV_#_r>A9LrnU1s=sR4 z{!J}HxOiYH52-7_+*Qy#wnr&hz?Wl!r|qcmPf%7WTXs<>$7i;Rb%OY7 z@9|h_jm#@bK{|F^a({3Io+rUP^*@x#m%dl|{ok>dfWmX0f~#EYrcMeF|7dH`C%~_^=rF$I z60rXX-b-(I*Ijo%fK2%CFKnjedzZU*g}qkFUr>7)tROD3)ps|6`8) zO0K{Ewvsph>Q1Hbe-+|izxzFo%5uBEj*IV5Yc}T|e;uym4LIqg628s<5m5oPv*qA$ z08{E8(-MW@nNtb*;m_aVcvXWw|o`0Eg+T-wWXz7!R&N*5GP65ON z_u2W!QQZG*rz-)}L}h*fx;n?X*Ox^HxU};O($Q*8Uy(e8JkZlsw4JSZnfH;rhg87v z@JyxTH5ymWXZZ&LP)Uo+uGVaO&2adZym!RmU-CEW50B$iDUjs6s;SmD=)X2ciqw*y z;8<6L^7spnfXn|R#nMIjH}@QS7a-T!|Ioh){y)72XSj#IAUpCRn&#Ap+~Etk3{Jh? z#~sln$+n=v|0&zQ5!q3qzY+9548m(1+WWtV1|7tIc7VF`P@_w5s7l+Av>e|+IHWW| zHH9iwa~x7FDf}xA`WI!W0X}XeUe4c_6T0B)Q4*HtDDh{9Y=Cx_AJupZpa@Mtx8>~d z?XUjErOMw3^S=Z^UkbhM|1Srx%NM|T9ejg$=$G^iN76j?N2ouc{xeSN#bL`(KK|kh zIEqp1%6wa8D9818 z<>7BtNtfOb9r7zLL)oxppUS4kIl<59JEOm@9-Lzn*CuQNcW756io<1)ukjW=Cwm&j zaVRFRLpwtnuc@=%W@_>7x#AU1+`z))ak$3 zJ$QXVi~Jhxs~v~@Yi`m1r7*lq^hH!Qlo@wiwj>`l4bXz)8|{hO{rQ(5WgZUDUN?Cf ze;$Jj@-eic6IC(A)ZV_(1xHf1fgPQ+winA;Y2O{2?DI2-T=E1uFZXRr@^-PlT3%TdH5Liy{ff zjyI*QW#T{%ea8D4yiOtxG+br5d8wH8TeYM`8`Q@l?7&V(S)N~XiuY2Q@;6*t!2{WQ zLCDk5&fHS{OTnI{?n~YN%ToO}aWE$K_Ycr2wIsjGr}!)W^sl1tLjBc-CAs|hHvZ2RURwDZSC)%AqFo~_0y$zF}U0MAAQvY$o}PfXB`y>xkV~~YM|?_Uuibs&G!tb+ zS&+^>dpd3?ZB4uDfD(2<>Byzxy}#ph`T{C1hr_BIPULVLL5xIFNG}eDaoC!}Ob&^kieg6&2XXiohy6I*!l4gAfutQ#v~WoM zQ4!V+gWt8mh~x)CJE6VMLFkAP-_GcncNMw`-7)st zQ|Kl17W!c1(Fe98bA>?jhw_t<2B(r@NiSO1xu7W!d>A9 zj12!M+!r1QKLNw91SaHjOOhf{6g8q&)QhgLCMhSD7c0V^#3cShtRi}e7SSeF6KjaI z#5%Anc}r|4HWr(~x}>GpT5KbJAhs7fid|r5(nIVe_7Q!=exk29Q2a<7A`XL1`bgND z_=)3SZ!$^r7pIET#hI`=nJWg0!D5IQDu#;@Vic;O1{N7_1HEg+&4R1AP23AB4G~)X z>agiJBYcjL?QEy50A53H9ygWVEY3_TQH!)EC>p+I4=q9?06+{oQlIST` z7R_Q+(JFe2)y0}(ZLzLcUu+;Y5#JS?i!H=f;`?Gdu>)o}bQZgc-Nl|_Z?P{dn)>6v z4-yB9L&f2+Y#Jqw5yy%X#mV9nahfTAiI^{ji3`L?aiJIsj5x#gr@63A z*p7QMbYI?}uo|GTT0&!?iSVJ&PZ%J~5cUcCg`>hT;goQ?nEJjJzTp%|mMXQ0R&f>4 zM#6pt7Evof!(OP%#4*X%%bDAH>A0vfvj zdVS7qy)JNDukWbLWW9y2f_)dtOs5mdT^-H|c&G_@22MncI}1p4jzW;F8gVePsc=Pj zlC|}4Mm)Jhn8?o_{LTU-x^MX`uaZdYXhg{oJ|Mb)()}T!?}RRbwC=# z=XBt7oe`@GoBz&I1N^xDFO}P0Mv*YK&_|+)QfsS0#9`XG>8URzmyZp0hULLqydku z2xt_IfF{u-Xu)s)0a!(>0_cTSR14l~fi+Myu^M0vu?Ao*u@+z*u?}E8u^!-C;#+_X z#fE|&oVhVzQ?V&vGqIWA0?K#~{IsRm60o({8nBJn2Ji#%1H@`Cwg>EpHdzNA-UYCm z*bSxaA@%_5CH4aBBlZFG5q$vriTwmOa9m%&f#N{GkHn9Ja^Uqt0Edag07t;eupIdQ zNWmTSHyY4S^aGqAP7o@f6_^C*FZu&c6{iAD7pDWx6lVg?7H0#_73T^S(Lw|Q28+Rf zAz}z%C@g1;XfeV8Bg6=yk{E@yqmq~bURNG;=Om`vdyUSp>v2U56hVXaL6d(xNVaes z>R7iKHaG(KKuer;VfR-Bc7X4qhh765!wcg!m4$cU)Prn`$gWC*lbm{`+EnsPe$JqG z9ZI4HmAjH9A^3&k@J89(xFhaNwZ*_;V{jrj`&j|BT^+RO0ghv|_qXaG0jj5Jo*Jaz zsFZU922}SpcoezT#XjYbRuk?VWl*oJkd_9#un~W3j{B0MvHiAUv6nYWSNf<4%TAKx z)G}%Cmg>Jd{s^6PfCBlI!bxy+)PkcpB0n8?BTSOhap%aJM<@eoqO9ua&9BYD$2IuQ z(kIDZWQi-nzvNV(ONXO-q7ynq;H%^$yFEI|kN%Dm?woL?r^fbojxcm>jg$Oab82i{ zrZkQmONSyVRnH3GB}6L~i%%+z4*%+pXLasJcB`dNqINoo+Ucb4`E&dc#~+WAzJ&1X z4%&19$D}_)lt@zRM{p9Pg~13l1WtoCX(-Az3{D5>VK~Y=0#1XLZ4~ky4X5F9goL!m zeR{>JT4&<^2PRmxc>sK5|>0YkVPIM z(*Ob8sIZ1_&OIse%CKiSq#Gi}L})#4vE-1>yq0NHJ3Igsim?FcuOQS&}=6 zG2jt&)Bz`@+AV;x-N9G?^-+(%u7$cSfD6~fX+aGXz=azL&A>|A!`r%WphJFA2pzti4hm<3qoW3#$~nq%4@$w&wm9;*jKwDsz@Ih!$ytf}Ie{ihpG56+61CGwWrEfp zepTT_^hCDdemfj-WE-f7sEQ_%1GboN)dTR6C(Z~7_^|l|J z3;J3EKp`{WT+!#+2Mq3qGobHv6zLs<)9^l+Gw+jVp$GUJ-$p$XE%X8BaQ`)&6MAOf zAf&1vQ2C82XX%laNWYBNQ4fCie+zW@UaCpzp!;m zT!9Z)-2VgkB3K#D)qYk2-pFP`0=7yYR43Iubx0r6lZu@y{)XyG!aICCd0Hj@j=O&# zElSP7Q`D5zx0UUIh*zpdMU<}e;owecnMmqY4=pZq(xLtfx+9sR-(9&(X&gCH7)L0gQuVBamVju*z4)Y1)GzttS%v#)Kog};!mx^EqIM5n zw#x9Sjc~3gGiIG2Z4qUne?l!_7u;!i3G{fTe!LEHB=w!B&u!qG$BALd{k{aTXbBxswOLuTqAb^z=ub_G;rDdLs}&Mgg`TN=15<-&QUf%8l!&NH1j&vfEE zvmEcmI@>uX^<|yy{F8dL&UP+J{aWWzyi~(^sfPD%b-Z`0<5H9x{u9lSs)D~q|4;ot zqz!Sj38V*cwzml?E=yyJw+3bK^hXSF-26!kK)rEi-Wzx3y>VyW8+R_l`-$Qtv6D8n z%pAblypGUZI%=EMIe_n?RqKh~i8>Ro51$F>$7cct^O=CDd?w%qJ`?aLp9%Oap9%Po z&jfsfaVkoU`gSxEusQTcy||wXu%gZfYyj+Z05&M33-F`P3v7r!QAbd&>g$*v*a$t< zPQaS#>zF6_HpL&EJ`#RV!#d^@HiM?W2in1bqel79cG7X^&Y>rVRt{@(*oedC9Jb}K3x|C;9OyT7 z+7zdcIrQUj5{J_{oXcSdhY=jca+u6vCWp($%^WqxX%&ZCINZzOaSqRN_$`MwIsA#k zryTx9P~+@Bar`KaJBO7xG;`?9VQmf@aM+Z?796(auoH(p{HKla*Z6Qaki%gdj^=Oz zhf_J6&0#Qy;Zx^KnW>59FpXF2?m!^<3A z=kP9vKXI7H;d2gU4&M-TcAhn7`YdOO!wMXFa#)qa>KxYPun~vNIBdmXI}W?>TCQ?% zs_|5>{;#go^y{NqZ3nX0=NnHe~#iw?UAhms@2O-GE2swwM z@h0*iY2<%{6?qE(3pDT){#)pY9&&SVn{MDtL!g_PB+P{NI|90tbYYpW25swZNZ4nD zFCjDE#<${o|6d_z@6tdJMDcw~DiK9d1S=astV9btv9T2^tDqs8|HD#j1Q837Ks0`9 zOkxnRw6GCUrL+>Uut;HP|v+$5!J)-40 z=V=R*zKHu}*ZVGo9;#k=m@!M#C79 zfhlIld^0!e9#wLcw zXIeAxx7}e6Yg@i;WFKO%JXA(=eib>b+{fud?DQjE#PWv1ymmQ&Q8~ei>83*opOwNh#?$*?D0L3qEJ; z{wRwKp&^UEDmDy0)Sc*Q;hC>4%! zXJp{H9k~8n569J6;l( zs+WKL`>*>0HU_k12DCKLQ~Wu{m|-EyGlZ~wLvz-fU1xm^{n!ZUZI)!1$W}_66&Xgc zv4&_CXDDL*q_5bWh6^mju#JVV_t_$2FE&wfu$fXZ^GFu=J7)J;d&17guQ*SvN;=Llu)h%yo~pw{N)Uk;D;fOtu`!TvkjGOgE5M&H}qod zh(8)nJZ!jh0X*=qmKcADboKfbsf0ak2msxYY?ySO-DQXZNNCreIkdW+4P$=*u3g^; zdWV7U`Nr;Sm;uirixJ>=tigu4&R{tt3-GrH?_AQ4Y`S3!n=bvqT9a%@9+I1tfY(b= zS~31(+PrD*G;f--J}07|Xu1VRp9%ViMjbTz{$L3xW2t_FHlnXSfG(o#2He4(mKL!E zpwDYaW1}GB9@3NSUPB4eCF}>l+o1aiWBT= zhIY8Ov-XDmY>;6*vl(`?48sGgi}XB;lHOo7(mQOXVJ{nE>(8iVAZm#CBO0Y>;sp>w2n z1SBUv5Z}R{2LTHK&jHp;B~mELBY<9j4*>~)XACZuMmD64Lo%lEZc!4SHC{nKG~N8C zl5FN6^n(0DlxD+YG~J-Nke<|)V;kI)eUZNZQ~50VM?;^Ug*~?$1`pa~w z@%59;cl{&(z1}X}XhQ!M!gdU>U$UVaC2U#p0q4J2F4;8MmA{OoQhH9@OJ`A%U68%q zRKgEDVOZmTNAe(D|K~D=bj|=jLAL5IV{Y8*zVxP2^RL3MJObMuK>kIuaVjgJV^mH9 z&q)u+w*Ft1M)Fbc6aQ4+@a?*f*L}Ocgr6#cPCcjD9qa-6{3JWWrbx@!6vqDgH)Geg zOZ(YWvTx&;Y`(OQc?0fe1)3cytkQ6Xg&3!RZzoVrU=xkGsB@MmrCeV`_F2E+NvyL}gR+oy#C@ui0RQJ<1EeCB5B|%SPES@cmraLEf~Q# zt!)-7qJD&{ekr}iI^ez&jirNOKia&&Vkj0HPyY3VWD3}en7cP%qwxycM!{D9gNPkq zXf8d@WJKSG4R>Atl?|a1zI;69nMm#MO8;X-#jf9^q-Ks__b~hQ>xLh$D;T4#Gz~8o z(R=ASd?U5hdPw&ZCEA~!xQe>Of>=*~-M|z!z+X4AaF*t;2e2k=qQ5S)2%lAvnTr_9WVEqw{dF_51_b--jaXPfl)v7%>571^{O&!6?z z16fYkZht+9g*9vBuLrZf&06{ECgsj%kzrzUvI=>Bj5Gc8%Ot!{Ka3lun+pj z`s<-=eg8j_-IY^4u9DI!drV<_dt!V-cYDE9d#&>Wgl(`DK#Kp(Q_aV9W(O+~DZ}eNcxEE-qbp#+SA=tr7rLy zuhL!Nb^BlX*#vY&_Ck--Q6>7+BPq^gsy}X3sncFHwbEJaz^K(;(cF(E&YtFRIyGGN zXp05Q%bX5s>hRhNK!rU!Ewf{0dQN7XJs;@Ykc_LMlfzS0>jrzON*z^o6Sy&UOv8D! zCni)@7eI9OB6qpNRS{<&PGgjmxeFX+8V~Fqx1-4Jb(K^&N}RDbF~aUFFK`#RoL+m8 zlbYCz-5!kX)RC6B-9@0!<0vl15QSi_$6aRkPW4tf%c)N}xCoh6fgMD!m~a*N=MW}SuJXz<=M*aGRTa^o&Ah-_RpkT`?h+>m@ep?~$s%wE zDhih1Wu?biB~U?&8gc{;3d^c787Nz=s|a%Ncp!GPt8sW-S|=~mMUV@9@y{FTY%e7p zqq!G@E?0r8%vCj&?x)(FQ!1T>P%H4J++F1KRFI~T0=P>&j>^)hai)BCkz?u!uiYug zb9tTi0uQDSGGKHX<|3E33dB{_^#ezN8Ky|47f@-i^#~xM7;F$jyvp` zu0m&p*J(1<`47!^_;p!0j#!gPlK~m0Jx`|&)Ija1cagoi0$kCE&&$ZPXOl^4js56j z?Yh56h)V#oNTB|{q`-ylN*9n6ILq9%v6|B0p`#2^a@4@&9R+1DZFmESG%abE-BH!s zSUGb1@QD=*bulRdG! zJf}d|lbf0}bYNyG$aUIF+@OcFi1g!c^Rvfb;Pxahk_W_G zUR_2u0evnj(zLM1S%cYCmP0=XOQE|A({jUbT+lhqXH|OKlb~eYSPeyWWu@B#RUvI8 zu4`V2Y{yv)Ev(W=aTJm-g%XjOmBCY1lZKI%-moaaP0$4FHJUZpiyJtnVh>jRn%TLa z)bNa@+IU`jIgF;jY4?_5QgB%q!BtL3aD$eWa8nhqnNnA!kPQ48Zs8?~SzrdKy}Q<{ zP2h%>&`j{iO^C^9#)4JVa6YKOtX##U1T+#x#7sP{f@*TaL@+5lR0gU~CC0)%m|fwn zf-RS64jvE7y`apTxLh8}1v7qifXe@QtLVY|M zu{34Sdn1?#%cBuB5ol3~G|bO*f!E`_yBdK|(>`)yHw1xah#5D`x1L!Rxj{7z=BTU$ z_aQWmf9}F+4T~NntG&cp@ZOJ8L=Tsz9;ZnwG>gQ3S4LJwenxgyp6Qdc`o82C=2J{A z7{d@QuT!&%LNea{NAcQZejts5BLi52M~1wR+9B2wSk|3(oxu~ zGo*j!AB{Owx4>JBsfoVMbjsm(D5r816=~9U$3om?PDHnoSmZHaaseDsRW&_0>h~7( zTyrt*GUriEU4<{LN3QN&Z<;*hG1XpJ>Zm|^R01{glsm}(dFU}YNsR9!U7zsqiPzK=@v# zhEVf-eou_2_1&KcBk-V^Dc(^x@(D8u&fBFAF`j` zCR0LtdzKSn-k(V{zyVj}(L4}1;DY#F=!bw-4T;og5P5t14ckG7n{^t#RF7-^r~zEg zvSLUkvHgGUc}s@s*lt9R`b^Ve*+0h&O~EK8`-6tlf!Ip|A*PTpMeszHfDEC|Rlp@9 z>C&81RlPJy^YchL{o%~-*NW_Zev;>-th|#0F%(IPa|*Iq@~#Lj)#Z+gPFVC5X?YfX zMIcWM?tz))Y!CoE?n=s?otST7Da@m;c{vjCB1e@2*qmj^b}2McKN;88)EusZxj$D08 zC8DIOO0(%Iq^z)|dIspXJe`t4w+AsDu2u7S$v1qr2txjtf);QAe$QM%Sqq{kt!(`M z0Bl4o0z)YJQG_5LO)CIeH)zScK52@YUE6D!47DS&{r>Uhp|w{c`4-NtUfYH?gk%mD z?9U*yOax>>xaICD_ylJ~k=p~lk)ahK-Ke5P3^~V}tq4u06gn$4b9NL?u5i~Pb1D%G zzu^O6)Ai`M70nc&X}0x<_K0K>Pmw|V2l0S6-2`tMOwjMVD2>D<>YS727bs=*Yc-s8 z875p_?bULr`Y{r6K%xY}=_{JLlt?&1t&^XH^*i32hy8z^e>LC)7^H=od9)WcJ0nk0rtAu19y#H%?&(^y7QDvl} zUz#1XBo6}Sq=6Zk8Tq4P?P(eLS%fnUNR#Y2NxAtM$-^^~a_u?8bMehJ6*y9WHY+15 zEf=Gt4o$^^5r~qrb4KN6qz}rEMW=i`jJ4ImwbHz+AH(@qSzfx|v1J2M5X2d0AhBrGchIheS{KkRTN4NXd?8R&SanSTa#93W1m zr)H(*CS}Ij^Kw#?GpGXAW#pzNgFv(dyD@n@1tw${d8xyO;{n>~LqG>+a}xeb zCjAgI&cX}{PkweTc;F{xWJX?UtUW0=BaeiTmYY2k$RP^wh~_vPEJRc2nV^@%LeJ=( zw)noG5NJic{ftXVP09p9=tb7w+v@umH?Qyu%e|fb&pKCPLo2Sbw6Z@^vhoS8qJCI- zPN1C`yT0E+yC5YM)!N{)j52Rpn(F#r6!bJL7dC02Ehyp!mr55ENke zh(TJ^q)Y`l9@&Jq)Ll)B4lUCuaUnOua`UJ?!|QMqB73RDW+h9;E_NlG$~?@)N*KO) zVV69H6|(jy6IndIa&||p04?k+mpNGx%0bM5cCn~sunM$|LoEs4_R3J!;qhvBPUb}~ z53AAo#<6Uz=E0Z_yzv4<6>4P|y^wVQrg-gdAC|&WStc8SpBCKQqf>)EH@_vC>M)Mb z#`Xfc81iBM}qz;$cA`Z0V!2!t%(0A7=<`%X9H1l0gn@sx|x1_C-YNCJRo^HHEwuOuLjma z4MQ!i1)x<>U`Ne?SrAT=J&o)|PZ!z?Ef6{}2v10FYSEh7rK3O5O7bMV$U`5(NMkkZ z*^nc|zY0ye3bl5mVfDwU&yPAT#W559{?mMk4&qG}D5E*kjKo~4K~H_`4QU~|(=;lm zw@%ls`9@Npc@gJHqXkx~k<|!Z*g;_$w7DZ79Y0LT)Hsvxr;hkSJR}Zx0uB%8t<|_i z+Cy_7UffCof1h^@Z1bPxK{hQkp%QX00L>&NJGk!F^pz-}xevcFj}o+Tqa|5rogUDP z-FQa6fNZM-{T#SDHJ|XGD6peVxyF|w^dsLuqf;rckk%1D#Jq|74Jj?bTQ_K3wgPvnKvy|||l^>NCzHuRMG(!2T`t}kKoA*7Eak0P!A-}Qh-EXUt! zv?NXvM%~kp=9PhZJDyXkO58c|jaa|edr=R;hdP-T;7OH6o!|t1$D%zUoSqxHBP2sG_IJw{+8{KW?0_tnxFljL zS*Y+#6gzH?M)hYH2i}nGRpK{qo$Z93C|IPVD0_ICVnx#|La9rI36IUpj>QRU|=LW9{tL|w8 z-6TO_OJpM=$~&Nw>}PTapZEU>QpCxFwLa zh*A_$O^}xOTc0C2$jP#_QL<6yqm~J7C2LRfaJ8e~tvO;xWTSkNa>+E%O%_!RDm|Kx zlDy+t4{h8|XxZr|3UZJ=rDA47k>zBfCb&zpr+6Uvqvu(=1^svVQJyPiOmR`SGhrXX zn#o6(X}lDiCO(xxW9ob%X%G1=l3gXdyzn17EhJ-#n`S>)ahtl-@05$k2{p*(0l4Z-b#3A%6s&@RCpp?$4EQLTU4VIvo1t0 zVY4^KsQS7oC=|5Upf7Pk=pcUain_QH86EM4I742VxIlcWi*__V=`q<$A+Exgi!9iV zwj$C{Or)4Xk%I7({pxdYY4Me~NW7&t0w=98h!5oZD9+Fb6p`y}M&xJWt;i+GZfPW; z88ik-kSvq9scTn5o2C(UnTS^8V+F-}rb)ab{!&yGR!>hvv~r=h?g{ici8%_Hkj)mL zCq*VPmf*1N;b}~wk>p4e*HJ1W0JXN`EzMTMWzu4zur8ufj--2U5s`FG)Xj`2CeG^F zfzTWw2f`$LsY~-x6b*%@>yj3lO?pW37Tlp(k&cirE7CMy-s;lUdHdfu5(gZA z=d&1{=($yY!N*d}l(HM*u}9;a;H*xG;4e|%aAi_I=INZNvjXCPSS#tCqoJnPrU?*PdGo$>CvT32aWNG?5sBIze*3nYu zABE+Rd~~g)G086K^qb~fxAvfw?mtOD_=>t1NxKzkh=o~zd;rDAJZ7@D#8a^<`CDFM zj|6t&NHIWU!NRBNbdlDPCJGNu9)cuEoS)qQw<-yytt{r!i!8IqqN&p*(PRo~ue2ZZ8uLyt`|(PvK7QRYr#*2N2v?KRwG zqi8@B*V&Gci%xqsFo?AsQBVeKBQ&i3b;Cc>t?Q4TeTck5&kuw))p6nP*|LcJV%J9G zGs4r+RbT1c9FhJn`lruxC^VDs*2Td8ZJxS(Zsj9|cG4T&6I1p>qlg$umPT4eEl8`y z+O0%;rbiOmArTo7MQwiz`|TPI%GyM3q5BNs(iHk(p=hmVl671V9`HYDgYZeTwjg?IQ4-aZ@ln22 zal_Z@(oE8LMO^UwqlW67A?}kli`A)!VuW4HhH^;pOvGuicBlOo{W;kVaX{aFAseaH ztVXv#AwAt5NGto*3|0)ZSAWvISQarG; zwt!?UHl#F+6W9|Zs%W>hZeKuODT-YmS~HQ?6 zhV!SrJ@P`N5xQ28taX2-M;~2#|Cs}1O=2XG1JS*n?@smSC$tU_bsoq+e7uqZ6B3Tt{yCf#;2~Z~Te;@OI zm)Xs<{eA86Pnt#=CN%B;vd$o`{HK)$eK#PRt#5TgQ*_HDN$Pqf_7cR(O6YFGtU_eT zVwX*)TJ*kEey!(er2P~t8?MesAM~}J$nqNMr=If>oup@-H2osICS2r$r{GF4NzYx0 z7p1Tp(h~aGK^&*ZT(_S^-cIaPh@4pHp3uxX9?%Ma;tyTLzB7$TSc#L=+IdUt%XuKfrGvck^SgC znmAYCmyN#m)Z<0N{6J_UX`!wmBCDv|Gtf1KS_+%fBRO%I zw00+pr`ZW>BP$iV8zc$wMvrp;P1^<5DUhNQIzjrTXF-MdCQtO$LZW10l!Mf9oph;T z9w_2;9mnWfzAmHxmCwRE*7dtJr%4vN|IyouJqYpD=>M(t2)*gnKyUt8g2XYB3E58F zN=!)NR+$sE7hdwetc3ho0qHZzLFfdHLiabXBS{lT+GHKV8~!hQ6hw>8W7@M8BQ?~* ze;TnqeqFojuNVIRzyI~mI&t%=CjZ8&CJSF<^nI@X^sS4eO*Tbwm*PMLq$7NUF0UHA zrLPC1O=MejGN^B9H)lN}tJOU;VZM1MRz&)nXF%(&JgmVoL4O8fCauzl{z0hGmnr?b zRvv0;cs>&C=-U(hswfXv`Vy6meV7dG_em+tjyNCiFAKeBT>3UgD^QXeC`Fl#t3IljnNAg97UL0Rf-lLKgP=JHxaq4X;TomUNqe37 z7+0s0I7gHw0djE7#asF^I9%g2y~#m67uRfzL;NJnL={m>yQW#-Nv>9=<2_LzzAy@2 z(W*HIV^fQC(3P)IK_k)Zs3mbPAMcZZmHHD6L$s%YGU5qInP{oQLh+x*7IYB*NBHs4 zel5*E6MqS_(2&2=LBEE}MjINHa1TT&cu!oTua!ct1b2kQ>-3MPPQfTdFU`A7=Jn|% z&i`Eox6%P!x`d0QL;T3pxR3|_r9vWvNj#zcq&=kH$$kzBoI<;at9o0(L$P;3@*4(e z3cd?`H_w9RHB#eQ9oGe)i9(V-jVSiXb$bxlg$#9iNM}ixbW5n?3RxLZLL-r^>5fJq zOCU|k22bgoZiPaRbU6;!`s!GzUqk-t)}pu5`~4>mA$X*ZO}OjkPTE1d6cmz_1vmaX z-kX1q(Qq&P@89qX;cLD4mfx^lXJkR*7g}+sl>++1-%|cn&L(L7w;$-G->6N{RvrbQ zkXCBqmmvD@JM`az(0*Mt@>0qU=ywC;;b~`wGAi2p?yS`)^QV0bF@thE%g{W0hK5=H zy$`h!D}Z9)q_4GNzl&riRth3F7waI3>>_ed?m_#Vl&|U8674wA&LhPbu`BG=T2LgR zJw@tC`y#M8|)RfLl)ki zb-=F%W3iTv16S$SxQSTxb!FY~ONt(>C+mg%qdu%J>&NbdL-(u}8k^2$u$gQYP9d4Y?!nnpbJ;w0AI=AQfIY|_!pRtqut(W^ zwtzjx9>>W+3vnjLlQ;?MX||Xx!C4v0*fVT7Tfv@XE7>Zxnyq1L*>h|id!D_(*0T+4 zBYTl;Vw>3(wiTy^yu`M%m)Q>X3VW5k#&)vT*&A#Z+s*c{H>FkVEw-2KWBb|L>>YN1 zz02OixhU_m57;4`z3~zIm>p(E*irTgJBG8iPOy{g6#JB&#`!I0*=IO$;XT9qhI7UcV_V|}<8I^LsQaRRwOj2`_Ez`@b@BEt_TKgs z`)vDj_D#`pbZB%~bgSsL(Q(oF(c`0+M!yk#A^OW!hE__eCapqRSzCp-ifYxd)u2`r zTRGc&(B{KG-c}9QuY(RdTO~0`k-AICQod9qO~v>hN!JX`G5)(4|I>Qo&x!iQ9%^rH zw`=1k+I!t{{JiKf(T_*J9DOGGqJR9`Fn)_0;}`kIm#$yG{s&I1`5jc;_;bCTsQv}p z`0Gu;jK50$4F2=OYd>7}U4B%&ySU`y`b(oOF24BirKT6Zzj(*RM=#F4IP=2Hixn43 zE+${>rz1PR;ruJ-pJnXA1B{)2;QYMvp7R6GC!dwhexkLIaGileTzX1ROIxImrSA>5 z!#<-7u?CzLW9TkG$3>+f(a;^Ir2UsahPH;DhBSkA;2iqkTseaJe++{RgD~zY=ppIx zuh7&`X!C05@iyq=YwS1Z^mowm=W!z3ZP4tE(DM_}pC-`ZJAEx1f8cp|xaB zYhh96U{hzHjhFn|D8a(M&@^%%EX@kb_*&D;=`0XlXF2R{2DEPuZ0{b}#l5h+xti@g z2{7JUO1eX8Ewz!_O6{Z=sXei9j!17wd*Rb=msYTy(n`%A z;gmy!kr=;*?MG<`%mPq6StS74#-L#WUPZYEuokcw@SGohMY+xoIDZlPCmhmhFBB zLHV*DZbP}l535kV;s>II=1K4jfW{`ElO1>Z;YXCO`=JTSH~c_j?()MPlr#qd3xMtk z8Ux^;G-!(QEkDrsd;LJq_W9u~N|Fu1X~5fl*o*QVzyUxt;9WnEY~J%jEy{y_IEV6m zKTJXSfgjGGJmiPZP=4r#ODI1A90r^R9PxvM@~9uCq9mV4@CD!);5gtifcQl~^El~; zX(&(m!HV)zKad{L+z7q~5KT1iF9Ado!E^x4fglh-G!X;?F8E7$e?TrE56}0b%m+;HKbwfsf#(=oDgYD$=vfiK z>o2QNRs(AM0Nt170HEsxq{|ZY6(`p*>0SWzLn2);qlD}=xF02WL_qc}QJ;@d2cIO^ zfpi4W5pWdn2_Oq_3~(Gk&3jxx2l;MB~w85MVJp@Rd zQNor9NWTp42_U^Nye~k4E*U-rkexu+3}*$99vMCpK>BDnCxCR#7$QJ|{utW|kf3A6 z4FbqV8g~njptr`o0?5}!%>mp8I>E;%&=K`3>foI{6mUCecn76b0HPMNW4`#;4Vv$< zV~zym1MHY90U{d1E*8V?mFBnXQK$pRH`wh05bc;fS^)VJdn*CR-I*Qq6Oa$JL$?UX zm)H{lU4S2UWbXy&jps*DrU*bb&g_sifdqT8KPNzX9OWhfVVQ0{zi>fP6fE8s!+kc+{7m#CQbKE|fF|KzaowjRC-k zhAf)K0N_MJ7EO48Puhc$Z~-L9DtfU1=~a}37a;9Kxm1Ak2FjNKcqZ*fNw@&gK9uwh zfYTRQ^cetjMS^}spBF&-9eqIn>3j4=z~^WKn~44b@FnVRG1kf;fZ}#5MF7RXR!sy@ z+-`N70E*|WLIkkeQCbB^%Tcxvfc%8D3Ku}}wiWb(fbxr0uss5b`K<;CpxE1Lq5#TG zS``7DX!8PNZQut9D899U|00l{h0AJ(r@iFAp17L3H|~2 z5Ubc*{E={gBtt^mR6mEzf3P1t>vYx3t~QdcHa7U02i()h(5aE}LZblHaLv*(VB^2v zkXu?qo3sr3_igXCbjOCUUx5c_LN-DE6~)?O_1y>ic|);o9*323F;>J=*c{~83y@DQ zWvej5&B$inK!iOAtv!jz_&GerZ^*BMkvq3Qp4EK` z7-uLnxD3^XdkpgpiwsK*>kKa$UNh`5>@yrN95Ng=oHKl5_|fpYkr|Cf#n{+*yD{8o zH+C}iHYOPd8S{+ejYY;u#v0?j#s`fHj87Vu8P^%N8Fw1@8b351GoCSCGF~zMVEoPK z3kV1Z3a|v+9uN`GDj+5xE}%<5&w$i`+<;L569Y;DDgvek%nNup;PHT`1C|G@3)m8{ zBjAmI0|7?@P6m7y@KwN10lx=alZ~=TZYD>{cgP*&1i81IBoC6aBcpsxGXmbWxiwNxg8CBpu14oli2wkGaZ;V><{*Vq$#v zGWRqb=i^MR_P8~)NhwJ+tgk$MITuB zI!=Tr$3J5yx=ZTS2i0LJt*Z_yaCk}q8C5td3#ZJ`HA4)9BTi_%3~eNrcFhp9xeVwf_LXVZOi)(_$kKXLXxFTIZ7b^4v$P%+;_9Fi^Kn#8sWTN?S5cBJ z_<&zhP~K@bYILlTSK~>t=JUD?OvW7!((HD3HJlz9GEUYhDtA>tl3pCWQc*;$yCink zn)OI?6uVsUJ$rQ}!6zofchialnqXo=g4QS@u{+Kdf@$HLAnkEC@wQu6x=T#Zx+Esh z@M+zXyG(O>+;K$}INGPesg*cYR+Oc%46Rm-Gw(zNXHaStuWO1ZL2rdtbJB^zS`BB5 ziAEacit2I*(HTc2VWv{Ur&S0aRS2I}YWS!o@KH^}M-?3M3xcQy(&M`%XqpzE6i?IY zmaOqHp;s@Q;!4L16<5*YgkFLry?SbowIhwST9LaJ=S`tyb){(6L%XBXcD4J|uKu@0 z723TPp%N2P1-}Ohjt=Z8-t`cL7;2!#=7fQwWeP=x#DtWAq9AjCHHacbkesSbAR(2e zgO+L4326vf+D)n$CnZ(fCE!)p#2)eS+F8nVCnb%IDIEKMImy|7LNj}qvaP=O{;(MP zP;X*=_$zh?3#E0^m(q90d*Tf#h8n{(oCW@};fS%9ag5Pn^coi;Px(F|0Xc{hImf#J z9|xQYxDxP-tjOWAP0p7emYcYuK^Z~WL4`q6 zf@TNJ4O$wsB4|U<)}YseJ_!0a=tR(&pbJ5t2mKx#7~ClM_TZMmt%AD*_YEEpoD)1D zxG>lgd{6Mh!A}G)30@ieT=2Hw9l<+;4+MV_d@A@t@YlgV2LBf9GXPHGxPpm z@V-2OOL;%3R<(b;+DDC7gWrzj&200}SO=E9e~JgZ%WvoMsr4Djsys{$RRe7n>#6RM zT@(;f0YZ_W|b9HCBCgH^X$skZ$@weh|-v#+1B z^o*>2rM$`?l(|D$hMNNArAH(AQDw;)`C2>0vb}8Vit!O@>sD$DHD7J~LE^6;?pVM6 zIomzMW~PlBsm9*hf(LS^b#TG{OZ>KXdB7igx4TN0*b3Cya-nCeYa~$|c=EkdyKKpu z6 z8B78#z(o9k2C}E!K<5D{sk@x4l_=ID+5z2fv3;I57J};pt;)RXK>SQx<Q-T>DwZ9zWMC# ztv1Ws)$*oiH>}+hvFRDF$5rhdWAiF=vgFOm)@R)A3FWTQMc(Ij-fJ`WHXSFmD>jAB zHY1aqRT`1zc5z|AC1+4o&e*73Q%7&kh)Bz*aF4e= zog%;R$_MNAN9^9<837;C&o|O~7M&>>}tDcWQ+zp`TE&RyYe7i=FqB)cH5EXq9Rku&_kGu(Z~tZtrHAoH=x(}%38 ztng@_C|meYWyx9j+E`^)ADL$kH~qe{2~EX`5b%qzx6Uh`f{vL02;*1pQjzUA$_&ecb1PL$dD?cy_=SMjF*^6hKh zQ;E5@@1C6UiuSWwSYG@|=3SMip=pzqL2A_-)$;0R*RR+f@$$3o(!8PxStXNKteI{b zcb8nX{FRDB5#|%V-tt{a#f+LM#S!<8kY88KYWQjXmO6*O&0}*-JoyBcJ*po$&2zm=EC* z#$}nzwqmu|8v09#=b^}5w$SfiT3z89UQ{y1W*IYNb`Y0%U#qKn%}e`V*}P-xnyTUv z#l@p-7SD=Wvo+mhR=*x=GWSwP)ba&2zSEeqzW{o|68 zyJT-4_5KSlELyQD%G{`pT0M<;AD}FO!@~8bY&PgQdB#l;0>t1CCz%(Ks4 zZB%Q1^O394weM^A{xd#HuE}@wBBZY7^C!*n})@vg#GJ zYi;JMk0eBz=Nxd>@X~k8s#J6JJObu(+xEP?!^|CO0<6q|zX|y3Fhei4tX;hZZpkg1 z*Gw&WerSZ+7UpkJ;i~3MkS_=wD^km3vwT4@A3cw>Wpa_cwxW31=m;}k_{f>Qd;srw zhTD0f8QBt6m+n$C54z;*e98R$BWHXspEl=AN>Up~nSF~8gkO4N%W7|N{>0Kkn?;7) z3g3fcI z8rVX9hCcq%w~Vz+dQifKCVe+vk1bjSKLcXHJ?OLDz)0Fa#(wWh67BS20~~v|*s{is z?)wsb)4`VR#}a*jJR;HO$CLN~DX~)$eLg%b(TBtH+9$vZ5`IcV-?1GMc2eo*L|#Up z7}jYYp0Qs(li^nk^kD-3&DXvlEN9ZA5`LH@EeN0u{6`pm%s@N;*to}aI%5;*BRK8( zI~jKSC2Yn|V))-O(HE0#+IQUr48Jze=o`mAiN3JlBf+cyHZK6bl9HA+!~VatJy_b4ZfL{| zvSMi5){xH(U4x_nMngZzFoGHSGsAFZ7|_U&#|%Sd!#K$>h8adP!&qh*X)sJ+1_v`t zWQIa!C}4&nW+;^mCCpIF3{GY!XNEFnn9K|n%rJ==+{{qT43*5_Wrn+%p^6!5n8Abp z+aWEX0`OCl`5^N$K0p11A8y$2!-)5!(^y3HGq?>44CjsM#;1%sjPDq^@!tWqfPn$8 z$r17@rM1!em2xMg+A%`Nw|JQSH8SsS@L@|~#2C|lHw zsI5^aZ3Asj*@NsE_96C4`$GG#(YEN`(IcWaM*r2SQ>(jLRkm8uYE!FsTV1}Rr1kBs z+qG`rdQ9sDt(Ujn-1^rx(QW#+$!k;C=0cmF+gxwky={Kmy>0imeZTE5?KZUA+3tgO zr`!D)BgNbn6CKktCM_mErZDF2m{~E8#w?9l9kVHBU(AOwr((W}`FH#H_I=xrYhT*_ z`}RL{U>%xw=+I$MhqWEe9m6|z?3mWEy5qea7j<0SaeK#)JAT#i*VusAma&Dg)v=di zf9=$$Q&guOorZRr-07{jthkAB?zsEoR>r*=cQo$1&Ox2qc24U&q4V_4NAN#X8WKM# zen$L)_|@^R#{ZI#oG?0JY(iPW?1ZNh4knyTxRUTkVo+jOVqD_j#A%67B(6=|n|L9)Mv=5D*Xebntr_pt7r zx+iz{bbqS*rtbT@AMJj=`}f_i_L$eRS)WG z_5N2MrBAay@qGsODeY6+XMUe6ee?S|`g;1_)A#YdEBkKlySwk9zF+lY{X+WL`X%-o z&@Z=NQNL;Z9`Coe-=TgV^*em0d}sKb-R{h|bKIRT^&i;((145qmj`^2G%RV?z?6Xt zljD;gP5wSbN-?HBmAXFl#ng9FFQopSmXTJR_G;R(wBOUi(|e}pr+d>MNq;5%MEbu5 zH6GMu|A9r|-tpRAIs zxjA$jUjb)+=g+(?ujS@R-{u~$9oSp?svKH5ILomve`)?>Ekd`=%GmMXwmIvkwHTVS zY2t~)d&Vs9^Jr>|?bBSFlOxn9HBgn+L^bf^UR<#)K4VRHzJA&kTFKd`XU>1TePsWr z&~110?b|!bGWwBozQ1ZEKKY{Y>o8vzW!X7dJ&z^xL;SYSSA466blt@_+-u5Gf9^MY zYV4VPvgO%G={VnRo!S4B-Q(27SiHQ$PaWN}^i;~|clgPKNtx>JvSqZ%mvObGbtLbo zrpA~o!y@@FzGJN;tFB#$H?0{Nd8%WiZ|qfXn@Cmp(`)S#Ssv*#`HtZ>|Ier5OwX*U z;cd_IC1;2zKA-5isI22{WuBt&lry{;S1ykGLbch{0m>R4aj%JIT&u9E>B{STiOkcL z^J{ZP4KC=W2G}fxYMUA!H_XI4*GjJ=|6Y92$ajLZHZ1F#B3d@hI@dO{=B9A-rsy{M{qkhZrkbA)aa#?y*Yf=jnE11YLwC&q(miu>fO!u8 z{Mt{}36VSb({iq&E=`HNcDv76Px#!(+xc>=N0gIT7K~CVrq^tUwxc$9Q^X-nvIhd+XhC4ZrR&6GW6BG#gVD%wu;Emn!Vlr z9E-8=ylyykhA;hn-uxhM{C)`k{zTr1&?|hn?~s*p<|VI8{4^r;rz?lw{rr`xjb)2% zp;vZ@<)CBxkio+W@+L=NiA{^x7b7+=!y>k(ZV?;$)8-YG#m4-bd~A!BE)(t5*-tED;jIY1-kn%BKC%0308+D!a zL+z%mVmS*F8FiBPJHdwnS5(+3i)qoXOKUxW|Jt3=s z%6oh$GTtn8sH}!52XT|8q|=S0R3%ZDT(zI98kI`qdQ_i^#i@HUzna#G2|u#Nk!rCWLEyWITUk@=mWGT=V|oH(T^m?(Cz9F19Dd)!015tgIm98CXh}t?_-HpxPtTA~} zmLYIgzOK-#AI=&%_k~;EjQwQSs4L^&IPw^0TV{URdh(zN8&9m{3ihyS)xZSrIE6+Wz=JFBU)Ddb)+abD&pjh3Avp+kLr|b zQ-e~~#&=e#*+G^mv(NC!tNHoUA-*w}^Dn_2?w@T9{fRf{>>_V<*!kY@)$oI7w!U`g zeE9cCA0uuD4oL4iDe9zKet+GrEk_~_y;3-=@6ZuFY~!%^B=1u~e>(f}gp3X;cl8=@ z*S1fqZT;NxfaM=0@H-+b_rfuxp7src^sZuh8+oeyt+MpA9IN1=oT^+Kcx@6^hS=p> zdfKX%DSQ>*EnA-a713y&Z;85TTL>@vE;OFMg&;Zbw?B9%etVxYQ0Q?r-f~-L&d1nt za`;k@|F#IHhviK^-GxpqWfjs(PiwbJIZXKk7taPhrjUIP%cMk z9Qf%YKC)K2{5gN^f|0)g^jIJNhLFq#oK+2(!#$HHVQ%W2M>?> z$d_y#RQmd!Pu|{r^w9Rgyn(r6Q*GJm@7CU;NNmC`@z*XJc^B|u)lS}r&*PqO9x~`FwHY+o48C?!1J9-W{Lz86+crf_RBuz8 z-k~-x55jiXI_tpkZyx>b(^KD`-Z3(@Q?|N#!-G+?N0!n~Eey70jc+Wh^$#9sy%30P zxYisXUkJQb1jp1LLC@FXoW!GjEv&wxbJvO#^{IearW@UU;O|&Zp)Jpodj#@7)z<2t zY8$y{prscDy@jydOx}Wbgz?Vexz_W_f@kCxc~3rWIv*2$Is2HZ;L`|8RPCOqbIP~N z-`{sR;>c#lXzbtQJyocVu`N(5tvj~9wA$p}Y_sr@vp@OfXyym}-lN=bEacadU!3-} zJREw#7dhLy^VP?n++^E$Ql3*deBQVSwf&tx@(_GHu<@?EfZu*8RSi;2nW{3l_MRmx zmOQ@fiRHGFk4B~{-cg?h)^5F!U#iq@60{&`tA*HY_^5IHQ~|c@7^831AfN` zs=mBUtKZc-)hc+KTy?&h%7aviC)q+TEaS7SMO7PL|7`!+Q!lS7AJb=8pJbb*pGkT> ztc__0wz(hv6x-Y(zU7zmF2W5=f^!#}*vnzlJokNW`1M%f!9mO64&Hs{)BT)6{HC~QMtHk{Mdo{!&Rfrqn@&={gl`E!!qv(48Lv|l{0K|U-fpIf4dUi z5{B`|><*E~uywWljO07^g^`9$k4%n~z6y(poB)4u@-tp>26vZ{$zyZ2R9W^JeS3R} zSIGR7_NA-X1Z}nQsT2`Cq}+8B{JWn zuPnX_OEOt_=BgTBA#|%TG=7V(_=zWC}NDam)_qLC)Hhi{enAcZHN;7xe&g;7`3D4V)S;S<$wtZFJ24l87y zs$5)?H8$1Jl@<=am;Tb{YIA&)3E@G$`>u87_k^zZJ(X%bvZdg%{M-4xJdWGLd2~8& zrP5MLouLM(v(<@kk!sAxY9t@{>h>p}*+OrE_gh2Ps{s>#_}vydi1#=TMNGnT9`I`G zcB)jOHcn2pP5LCYR1RIgt)D#GQ#r3Z!cw#PmUfN|ecTZlTKQC@W%g{u z!qXD(bD59-!svU@cL0m5O87!{R`R7>W!BWl%ZjA}68m_)rE0lM6n>o^WU|^M4fW=Jn{+4jjk_U?#5eI`=uZA7^wfq=5KZASLQ>9j95&(Z zyWO_e_+$7&5jsU}{Aa3sURm_I9Jb3HN5%-<3jw;!(bt;-XEN@x2Yvb;Sk6*g0 zry7x?N~&bD*k=zjNuR@hmd);HnkYv4{Br2d7fhj37DUdE4Be?Vf4}Q*QLE2bQ_4O# zvnJB!P#=)XtHu`%i?Ae{q>GpFjjJir;MsX5yGeZ(=9GSlHwBBA`O-a+y(29XO(CCO z4E+>qkyd?7p;y{R7Qje<=XXkc=ZD76!ct6wOzI^ywdU%mT5LcwiD&50CzJa&19-j3Oz0K3!zRN$C7c6^p>5}m82JPvW zG15J{AZpi?iR*JC#@tm?SZsT8x7<^)6wHR^F8T#T$3|LeP0O)XhFM1zsxdV@VY$iY zxQuBYfPk8EGycNru5fF{`SuwT-4zv4p`R|=sedAc$1Gd(a@moH`_EX1m%gy0N?XZe z(fRxv8{UpMyeYSv8a1Rt2b;yAwyoivmzyqM0_w+STMz7bZp&8NMD@`xH}OVSd*5rC zJ6;aG^4tvPi|G++8^q^ub)*{lLEoQkYtA48*mHqL9OKfzcJA?wHI|4C6}y50(qWh0doKbiD4?--vBVNf6dTrv zEgDVYy)lV#4mpebpP5}ybCY}T_jmuhpEGC9oSAoK-YIA1eV>^LexTX4ef{BMn>@UV z^r!am``jmP>Z4U{ZQpNFSA+CE@y_n3`C{hE$y4TT+O$ePdKy1<>eB4GC8U& zwm?6LJVg4QT0Qo1YA^IM>b5vNR*(U0fswQWv$(bu0@xCc1N6@l!s`>GW?we0)auRcr^7R>q z`Q)O+f;`QQIYo1m^a;sl6ZVv?e%dnUdj7pV2QMeJ%*E_g=rLG&bCn^m8$Zspbe@|w zR1q?e&s1z&?J*}TE;KIG5cUNh?H%jmtC4KaeDOULtkQXDw9g+=7z~GE&h&xVL4E%n zzPLMj8TZ;|NgV0@TwYAO8FlqV(tNEU|2zKctco2wv>6KM>q8Yw0@iFPO3Y5oF{Ewd zlh-GetkDp~=Z89`=z|CHU&oX!8K((}4T=fWhfU>U{9*%wH6y=Vc`#HT7tIfGb!!)3 zFb)gs?mBH?OiPTd*46mbII2wIBC<}ca{g}j`KuX*DGHToVYr8_8!z6ows|^(Bb0;EY4qE;;)zP*0liK<2$Nq%TsKCs_mXaGSqHY zmlOox1Z=q6cQs`HYZ>C-m zPhtFO{~c+2Sx$DA3Rk|aJiFOz^GHMau4k#&PVBqVa!5HpW&X59{k8AT`k8Q~%eQ1E zalX89j%%^u+a3H_PnWNyH?;U-3K&6oNct0!inIzgj2fQf%co>!uM_+?=+=kqM6bu> zYm;kzAQ&uze652nT_9hD3aY!}j@p=RI@N_PI@R5II`bEGF={phIQkr)>wBaPl#J2$ zRAx~_StU)cD^jceXf3!4cfi8?V4*{83fyPa6|~az)rl>r=<&Gu@&KLca634Vd*bD8 z(2Uo4G`NTh#LMsLg6g_j9C{14o;zNed`o4NksadGcXiz$cB5YtRfq{N2h|}{ zI~{-)m%T6JOA{!L5g#MPzDRN4JY8S&V^BIkJ?zJz?-Ym;o3lUM8u*RM=uBRSRUZqX zbxkeQjEvf0P{W6WmcR(oMs&D=zW(t=RV8sP6|Npf33zWFVNl)LwCh6p#hsgPv>d#F zS5;2;n(IDQJ7(G8Z%Ok5L?E_@OP0H(8@?^$uLOU-=QFMJA;mqpAe>}(r2hkxUR61I zc(yOEx|Ncdvrh2apxY3#L+j9A5FIItR+#V5Z%==Ld`lVheO;jCQFNu;=}^~)J`SS1 zxqJWYvlFD5op41lc5xXfe%M@sDMw0>apm;7=9fL ze~c>9#Qa!|kIAGV0#vY6Lfcli)O-gY6^jeGOQXJ57ue_`&ZjZISJwwFzBEtw?p{K9 zkG!iglkF_#VP-R}R(OjzJ#?xk;%FA-EkyZbo=*DA{0w2o2%?6@cG-M+x}d6TBa9Kq zcdUL*tn+Aa5f{blyZn}(M;0y0{vJBs*JA!HYg&Ds1Eo)5JV=1Wa|#0$5H3!UNL zmWwKJvYNc%&+n#U3Ri`s@+*C`hP;K(=ql;0@DC+rA@7q`Ds3LR?gCnTzcdt z(H{GS$o7@2K)t(D9&%y!))AR43;&U$^KZvX&D}qR2xWlgydXwL_1Db1^yJBx*+}F zDZI=23$veSA>p{M?pM*b=%8jx#rn#0{Uwi+-Y%L&IGsEM->VVCgA`CaMzI_s0T1=< zt5tVT%{nx^=b$0I#_Vx9XK*Md8_7dShj|GggPlohsC10d4E2NUJmwU-+STahrMK&X z9&RW4+HzhhQ>a!*lSfF}R-b&;g>;TJILwuxIp}be6s3}{t~zcZv&o{nWA3Q_*donV zKip0DS`|-hi%#r2qdmQG;pC4e&go|`Dngw3Y=z4FXyc>_l5OwFBmIMul8uJxqj*z6 zdBkQdR5CWdk~S9>9~%kL$sf1Y@2I|_c{Jj5`}ZaJ7|D6L-hm_;Pk%>9-1!G*kn(d- zY)wCKnY?vgby)N$)5Yl|AQyn;m}59&i<$LX1llkB8}7{@8R&;UyJMa$wZE^vK>A-- zJd`Mgt^*mwf0MiE*jF0W;p0oH-q%ZG6&IulYRvTnyIr|US1bx}2lfkT5Wg`e-cN^_ zAdW#gNVgBkG)%}`RB_^pGMz!yDNd(X#Wf^GuUc~2R<%ItFFB$}`WaMCq(3AH&0+RK z@7A17{T8rfIZ6HWDfiXaj_&M=~sS2=xQT;Mxb+h@hm@9(TT_3hsE9*c4f7t8r` zE2r%ksFj+H`ao)CK;RZSNIItTF=eC?)&>PWcw z%ey*^Ko;M9aE~L;$znB0xhpMD?0vukN-H%}?75G*pKEtsO8kV(Q_TK|mwF;qidmib z2MUK&onxTrqVfxLiohggsPMay%qREA$o0Z`V|SgX!yJU1xXJx?r*;Vhd%H<9HIZMx z^xa8A*Y(GS5rvlM$y@&b#~ePrgkdw+Z`cRp4R<{zUzd2QrF3i$?l!qO;JKmbhI*jO z0U(ZVU3h$Vk8|HrL!Ze*2lmv81D$%#tiHL@aN|hz)f#Pe<@COi{Ig*n7##M-*N}I8 zNRJxQ1AWn*`*N{|C{vROHPQsqqdNe~<3ELnxyOBlv_YDshM)?X&H_vseT5ACF9 zq$znu1pa$F^E_0ezIM{@RGMY+gsyRvTAWAv@i*|A^yjL8QYri`#^j2> zc=n>`2#Nx^1l^P92sUE=dZH~k!FN>0(QGIvv-Ejoabv4MTF-` zYem*YUV4`T`e4t#h6(-xHLoNE`1clV0?iOa-Eo*_UeyDIby=8wu$whQbw&WRlC0idgaX7P+wAn;P zWgKon+AF3>w3CYRj1M$v#&27Ae8c+GyfVFN#kv|kWR<6JnRaxZCiswT7&7e9kJ5EH~h8Jw6UHVDpdXyhpUrbB@;2CoO%I!8C$5uGtWZ(Wdks zDXk(Ms=kBXNw`ktK&ALQRC`w-9LncYN)z*PG~W$eH(~7L0Ix;*^b!1;jXU%AYY&wM z%n6N)i19VV2J_jT^D>ucdv%y5@y^F)U)aC9sJPV7sZ>43vt;Y3BPEq(TTLNr48foA zJ}YN?yCKS!q~t2ugK5!Q*NNv1IiS-eYVywazmZ=9viZ+s;4a7 zd7juDyL{_d*}UPBY)1cX28SL(zRnS9MAJjET2(;2jH?9I*?v0JCR3a-CPc3~I~;a5 z-6W& z3FMbT?Kv}Fny%@7au89lnbWdc}pv^Yg>?V zE=yXeew1Caw}cpOiLNc6$)p%bm>2o7l#G%c+LEGh(;7oIFxfsUvleJ4kM{s3JE(_; zfb|B~6rY&=Lnken-^qk&n<%eJui!{4QLa9w*pgIQvhz&U*gM)sTdJ-YK36P?S?M`< z+^~~9v>z-Q;cSp5+8$GEO)6d2;OYETcv@)jbc%W!=4^1Nj2FGgN?&e|lej}6@sP(2 zQb@k$dNr9Tw$55xyeo5E%fywbZpmJ!%&l8Ee2R`H1^wH2s5jb^6u>UCX*ct^l+Kew zQil2=Q2Z%m63H$XJ~iq}oE`=0ewI@C6e&v$>px+2AUVdT+;6{<{=brbze4Y2R7dK_ z`dEP>Emtn{0Mara>p@7VQ>4yeqE7s*)~A~w1-)>@3=_Cu%($M48=^3f#>n<52Gjm^ z@pxkr_J<1TblkfW?;1wE14)HawzK%Msy@6k8D&`5z(mLx-Bhx zgCRD87X`LLV~2vR(CETeXnd$p71A{tg;eqkEmKSYU$Amk_AISxvlNOcP&mMz?|g&B z6GIH&+Ddlwe)*kzgyAq5aA2dq_c}ulb0F`%$Sq{1)&Wu@2p7x5W@ZNnFWw>j0Ixwm zH}KcnBvX|~)*02ezuA6bk74|Vqw_CotB$YRw%6eHHLn`E+->e$-B%9{Id-bvO#XZ5t~qR;^i*XvjLUeOGb5XKst3^TrSCqnWwE zy8`X(6EVYw)-Li1dFM2FN8VpYJcHF2cbu>S^ye)AK!5G3O|ek>Fn~VvuZ@vRg=EV7 z3IT+6*!vyfe!KlEk#pq56S=4m1JxT#O3KSUOP4P7TDg4rI?s&;DL@(vmC$Xdgh+r? z2@mVaD?Hc1gV(a<>%2As5}e^vy9lYuGOBMVprLyqIguAsVw)ws;K^39RsFN{rQ|AY z??5&+ijl;77{T~s1XIc;T#xFuccJJZI*b1Xu7u6vbL&!oAd+$|5lA-1KmlUpQ$LXz zKb$8Y7IHP@pq!YE>K`s2`g)IH!Y+RHd>4<2+OA8#`6&(%eZ{u(yfj&nv?;YBz1$u^ z|QZQaCb$wrQkXp<%xGLrhgGxSPapbaCcl(9( z>8e6%lYF!@X@hS4OQR0W^#Ph|IvQq1xjUyoh1U}jaj0jWtJE$SSE>03;8+ug5P_g&| zMS2RC4mx=7Wb&zBA)lfisF3bB>gH1>r27m)x(-maQJk2bb*dksQ|+Lep(A@(Fag1! zIGdppc}8_2sN#94a36HqfzCuG!CDPE%o{OLDlZ&uskTiJjg-jLx-j&(csj>OG^>MH zgFX(YUeCSI<7u`adQrIDq&ldB@bFcw7qXzLyTzXR)OvLj&b-jJf`lbVcgty%jw(vT zo?`WTm__`6?%yP8#UCKPa>fV1G!KqHW8~FK{JEFlAYKa+$QAM0d$2x1qBlH~lS|^0 z58!DN6>V|Ejfy78F>%w!=v^Sd`k5m$F3HJz5L_MEQ?-o>t`3~xXDB}H4gugg-3p)O zK4IzUk%no@c;CEIzrEnS&)YU59W8?1Nue5m>YR@{3?tK%H-@N~it9vH&mu&m@Xr~9PrLS-n+&Wa7 z+DnjD*WE-l=`Gx>hEOnsxQYMlC6Ly2Js}M|1kt0gGe{7p)%w3Dm^;_`GoME|P0x*h+=%Jw)`jX*Tz+@f$7Kt0Fm`w^W-@zdGJO;sAtb^e57zA%| z)6LgGJdWlvu`aBWuGJ6$x;RlugDf-O=`7&wdDeW?b$1$HPoq+~Hg$bE3zpSC2T{Kv z_+EuAQI^#veV~(sx;%J>X7Ac_==O*Xb^p2e(+9c_&4iImr&$~NN`yL^IaeB?MIlc+ z2B_r4g^UNE&L5^DszPC<4_WNH+t=~C`{LG{sv@WeXD8`Y9#9e%S(Jq0mfA%lb>{3k z2c|4Es65u{^i*G{Dza(}DZJP*o;)0%sX8(WLwqm66)2=9H^0986d;^?9)W$ikIG27zY8*r|^?xe5u!>wG-*`85ur$eWm7Sd;NNJ*Xk{s4dHW= zb<)@>^{|C!FOxS;-TUo$#iC`oSOew8&ss9ma|V^%(<;A)Rr$|R<(L;gLETwPYkg1ieT&!A&pA;I?mIK?Kdeh)-mg)CGimqC zn>2%PwvHCS$7TX)^B=7QlN7pc;~Mg@*q$R3PhKvRlb_;s3s8AYtA(<&cdpzpY@{<@ z>9JxL3FnC$gFm|g`>>QJm)KmmodtV9b}M=>`C`g2^e}^@5#mbobmARI_DIl3AolOR z8%dg|5=dmcPBoe?N;87|ber0)ARat)-z7ceKY3{(99rvFRCc8QNisXHOsJt5YRR5X;p!3+d2O_5Oi_ zUKm`e5<=pFqXYC-HHoDL?PO{a2<+R?isoh!*aN!3)~%t!pJjFYt-3qFaJUN3CJN9P z-xg;wA^V)VL(m)lv!f3F%h0I<>>-e66O%z8*#-IR;Xoo)k{lftKM zN!+kj^XnG}x=fzoHG83cErEEo4Q+H%8`|oY7>DuWXrnu+=w#lPtg9qt{4cAIeR)QE zX!DAZAy|m&Z@_TiCe?b8CzxkhbzV{`=3p2EEYm%M!lQo;1r@%k@Q_wQ;V}xxoV#d< za@r7=pdGRRL|z@FyFi;@TwPD*=M+l2kd^cxv_R&G7B!SK-mIM8Ghd}DnG5(P{GsvT z=3G8a-jpAVST_iJB;}CbqZk&PTcwf!tK3a3@HjdTp zpQ*!=NJo;1rrJ9P%?qogcDZROgLh>WF*7AQWgq?i@x5ELjTAYH_$02<&(L2Szy8is;~y6+KK=YcG&wq)Ub;cP<|=1POv zvUD=r2SVWfj>L^9hX1ParjV0EAg1ygCaCs)>767jSut0y+PN~%ry@>oT;Q=Xn1Rk% z+$ptQSm;sH7FBb|zqQNOAxF&F>DJRj4!mzzDPZvB_rJvcm& z+qdjMAVA7u$D2IrqY;nX_=VV;xo&) z>#pLq=#iA2ejp*eWny^owB#@{%e=HjNMF-9clY*KR6bYox=02B=5qr;6>;nxOi9C} z57Zlm5Qpr;2aAYJ%acHTC6^=u0ik;QZ0hk3rcd{oH6Ku$%&)=()Ujk8%@UMs`6nw+ zX%Bz7d_+iWV2qz(jP$E%%<^TOAxbj|N2(b_?;F}1ZL0eo^AcZ-3JP>&9_@^d)D42V z)I>i$0P=|oSbxOTMKW)66bz3qXm|9H`93`U4hWp1Xd{jO))6wO>*PwUPfwk64bvUq zq!h$R<{E(FvHk7L!%3ZHa6dEM2-ePB}oKfwR%FTBn zgY||C)( zk~m~}@m6h4r_JO_X`g9eH z(x}>Fb<4?Y>Eqf|M@UEB!?FsX&ErdjcwysCp0r5)=?2jfZ)wkBqS1VPV9&QzUoM$f zpub+upY|K`wItI@+D|@fWl(jHW{_PQrEZ!}Cd}+QXy&#mFMXfo#eKdR{gbif7|h=o zjA1-r3|Kv_8eUcy;Av3BEMJMaWhmyB`XvGYT%&63%-hH+jOMDPcEyflII$f~>{K1d z0GgZ%B!^F^KJ`78@c0HkWOyvSss)2&ffhhnst#6IRtpBpQZ<)46YnewFiWo*%&=L8 z(bG!j>|Juw)N;g7Om9`gEepC;gUeZxB3@4t3U#+-Zw4x=RGjox&G@fyVaxslE^IOz zQx$X)jC90Bv7^v^-}gkN;UB01Ecj6=v+kH$<%4c-cPC*5ov1%7hBC(_z9l`l4Bhgo zQbAP~FYGu%fdpKw4CO-w=7SV~MZh z^Maa7s@)Jm4PpIl#boIW9}^fG9ITm}w{%Oee%N4|o~!G0D}9z(71{G!V@rh+*eGm!j0F0I*{}*ukK+$MCtCM!Wnf z$xh7>w$gII?TCVY*C^-?FlxD&S$k`wPC8Uq1Na@nk@8z4577620PSxA61kF;GtCwt z)=i;W%Hv<(-$XG}%A;?Bdee=M9Heh51I}fT33<=cjW$1?E~s|40m`Zd zL(apsNxg*fy6>oe3^;*8^dk$Hw4+;HPk7u*J)XeK&jnqDAlcT1QJ-|w39msSM?3mF z^Hul+9>!fbXb~m-!BB3~YTZ8;B!{}aG{{Z*rc`$mZ&XH6Mxj$FbxjfOFb&6HFzAJ@ z{3exdS-_BF1?$|WGxQBGkylJNu{#Dw&O&ywS|~rhf6tT6hMzW`zPg@t!My#0 znq3_Ek05<)W>#F5cH|P*>0>cSohya~&0b@tOM-cb1 zf$2d2tJ(`I1u>jSCx<{f$=-IS2&Gm)VzHO|*;w%ahH~uXQuaAoh3`Ro!3r3M*i-BX zVBKUU_8bdwWkF=4%cM5n@nHkgi%qvJ`lBgT`| z-*-sQ35+tIvZ?5H^G{f$OVQM|Zvsj^=eGQ3tTp~syunwb$WR(4zHnvQV6&-jo-SZ7hwbXc?0en;VyBzb9!+`995; z-fNe;PG8(}QrWmK-SrM;xj4#)oJFvyweD(X=`6n*(#=6gi96hyiape;b?+)j6X`6o zIGAgkb&k)_J-JE|tmi83B$#W&ABnwVUwpM>sw1A_kMl5M){^5sq_#Sg&KGWwx36Is zR0l=&4aH6p$fs;bSW}=;U4Jlb_ZXL@UW+{Rs=euzP{a%{_u_A0%9?;qqB>{ymP+mB zQr~IDSihJc14CxDKY#8#naQwOqrOv#jo2((#gW}R4iDtv!s8?3qV*puFj2m*@SnVJ>=bW%2eGS>Y`s$BNZe}^&5wx(CdU=f zo!|QU!08PJ)rHX|`~ts~Uekckn(4Le^zS?F-8xXP+%ws5a|8cnluuO~Ep!BsxqQ}f z|L})~VbWI1u0gZv7D1En_&4&|uanNb4?5D@o!^yuw>dWQ2Sd&k_2gx{&JzCEH{=3qr?;RcaqoJ-wD#31Sm=*AeIT?qNH3`vcrY4)n z9P^46HI_Azm{0I=;Ze(@G;t}x8)MSge4>w{)&q;%CNJH2j@SZBFemQUWqJr-@s@L52 zwcUqq-M7?0Jj5b95)}%6Z%X~NSYFasYAVG_D*+38myD+f|54&SwbaMXY=_lOL+$qL zKT~o;d+p-l*;|3^YHK<@$A@5or1ZISnl7{_e_WY#MHT3bW%0qz<8@@e*;l;)b`xFB zZh#wG(ykwGcAK zBd!n=aJj#Jsyn=Ii>q#<`GvbqYHt2cZC&+#MGKtpk8~-$FI`Fx-_~{S*amGhwn4M5 zdoNq}rFIit_wI{?cv=%;lx;4c2{|l7LZ-1j+>nq~(YpOU-<@EY)fMZ`xtznU0yMkh zk=-B7l3Eq)`s0OfAZrXBKL*Yziv`$b3919*7t-CT4x}vbiq-8${#=7~q#_#Qm=i9y z&*cduwpa%(h{~e_+XCRV_5bc=eRS5v|9$Hgs#P9cf4E4a@aTZO%-r+zoANecFEf>I zhp*grjP6ahGt2iV05A(R*Rdbq7vG0&jd(t+)v zwPm<<6Rj;>U+$tsR!8gdPH#PN{`AeWP=1mNmq;5+j)TicYwXQdU>=}$wd6dc3^@-ug`9_!A?F9nSk4cgvgZ8YR^)u3m5=kPKw2DQp&L+q(CDr+hnWZD z>FiZO#dK%CLWOC$Aav`{QZp~etH#7IO*!I4#){vU67MgP#BUE;2#2aGTbR3J7jes+*XI= z_yq=sK%mUoo1~0sYQLNkp>VY^+uuLL=&vXDocywlt5@e_7p@M0n-Oj*8=3Q=ew1p# zYEUQ$$@32g2@24wY@5l-C~mKfSoj$sdFZ z^0HSK24x3;Fp}G>nX`FXH&70y>0J#9G`;?MacF|tADKXOs|!FjAUFikwX!#vRsHY+ zbXU_XQ?E!crHcg9;FJwWfHN#3{v%!1^u;iL-WZnG1 zNyL{8cMCK9@jb2)vn>PpEjQ&!weFBh(G45sL{yQZRowMUI<2S1z z(V}~5ymeoG!Rdm6?z4vtHG;6AhU6E|wxuBZs^veBYoF@az8#X6=`{J!hm1rq7t+q@ zG4>#NgLXgPOonJAq619o@g>0DMiwI zo7DfjdF3DH+$x8;dtoodoC49`mQ21RW$l(@E0#Bx&u-T{uVH zy(lLmOrPt#*KR$sHCrcb!k6gxD(-Q${IOHDqVQ=YUEfW(?6WPT)e7Tsj7yf9PLL0d zqnB~~#?rz3NJg2Qg^IGR4ZXl3o#emChqOOQI-TV1TqLc}${&WRNtZP%bc+X!UQ9v4 zWvn!a%2FKRq-=^VK>GM2S{@koumTx`nU)d*p2ji>^rdA&wpa?~r)qg)N1ZB2UShM` z=g1q5_<#?W2L6PB#43C>U+eTP&^`~mMg&%7ZwIrB5ru`_6BJU;U}zpmNdv#Hf#1tW zNrEsA;rvKR1K)`9ENKnK1(K4_bzb1yHp)3VUIXi})!&vp9c38nX}~a2(!epIXkb|| zDRCCc%eFC|d8}}wJi~qsR;CdR;~I9aTMxb!uh1Chx~jPnmHt>a4W%%;ea#xO9UH;>?YW&J5FrMw?7ghN&2;A!(yV62u~LQ+Q)! zXmpq+G&?pk7N{#1J}xyaHW|PhbvPEkjYl^9oUr9)S~6YnZF*(P&6udT*eJc^Feh7F zhBa&1=4Fz@u7BOP^ApL$N2FliPAzzI6uhavs7_8xOh`45oJu|uE5b508KKF>RK3I< zAwQGbqs~fqq@Sk}8J`suofWDLiw+HrHMjtx7Z)BI5v>VL3(vwQ8{F9e?vVZ9&OpJ9 z@S>NA!jHX7+X>%QXN^oOzBp4bMYst-Szo)#?WnyeueJR*{QOARCfV?2J(QL<{0D-l zSIo!r%PnxBeF1v@k3LXGHsh=9WNl!6g3A4{4Au2p3CR{Js%;!au9lCl!Og-ZMN}dlbvL< zZJYqPx(^=?_N4*25ga1`n0@Cr?5306T_LtL54Gf+T%b9ZE?9F;{ncvk%WJh(pHh{1 zsJ|{XWhE+$bb(eDav?-VcJ#ke&;4SOeOoUJHOYLrJNL!)0Ezk&(Mt9KBm2NY*4#D| z*wIJb73A29_x*J#si3Bi9%S<$+K~s@Y?I2cm8!Fp0fJwL(XKx}0*?GM%R&uNOl$t+*)=NqCCEK93>S1sjM@(EE9iP2h9M0jX)LPTP?;Q-o0 za8gnz?OL+3QVo^AV7bn^31c)8HqEBHY(OT9tzU@t%(_ztD)p0&@?*v<>D@yk4aMe1 zZK2x29si-Xm)@9iLjT(#J|{IJIYX0aObkoZJCw1uRqH4AQ|~oTv&-4qRX0!w*~W|0 z_L{Mg_%2@b-D~z$n`&*8>-wK+9!y^ zi2OE@V=1keqW(a5c(t2?3~uhXiA-^FhRx1FY8OxV>xAdXNK`z%=&DAC&u`~D zU&o&I3O9TJFl$?@hL3&<>6k6Mqm!Z$>?O7}#8zJGX=M>ja5v|NmPFJInS_03uVT|# zG6j(`n}gH_OF`_e6FU|g$woErC)r(B^s}Y6H9E<0t?;N{SL{l+eKbBufR9bd< za$5eOu*`xTY3B~7)4{b&Ws=#*NKh0O!)`u^g}5@Asc3cL>iqn?rma=Q*gg>YI)fp{UXROW6*Q{}kHSW~MrpE!RVILI{9~SY&u~Z*T(6WfoX#I+? z6@jb#?Zd-Okw&eLe?g&PP0H$`l8Dtsnw*q^%d# zwo_L*!@W>Zn4epa9G4uIYVbE1{iF3^apCcyG4@yv5ot1I82vRW6GHeK!-6!Xl*p_Y zJv_&zB4@=h#gXbRnqobVj`=(NzxL`_msd`e1IW_Ef^ zYGjIj%C4|Xzk;abmQl%(sg&87F6WX`hS@brubLxv(bDK<%)mzR>7Ysg8>OUX^KPfAQmNYNz4CB*9E;u7Mt zu@ONLOAIl_kmz7-gd!p;J~`SDog9@Anrn|zO+q3P5)u=z7(OvMIVmeWIWaxUJ|!tW zDM^zRosUU1hcn2GF{Uts$`-cpq~HvFd~{?CW@=&0WTDX|sRda@Ict)Z1xF>srx?-| znAtUxrKZJ4rx;W+=eK0B>G2uqnxf*Ig3QeDuvAKrlckyxLcBF`F)^{o7F=v(5s~r9 zhUDbL98FGmmXZ3hbq8Y9>KKs2Y^eR_uGrT1rf0(<*7!wo|rcaB^j7!-8TBv2k&+o-r%^^|5Ko12z89(GipM5iyAvi6tkb7*g{Rb8|Imv1zdwVIkKm zLR?MmGh*_?wJ}jKv4*((pg@hv78NTZCXzCRZjbv^ELNw)rA8#{!B}i}kIK=sO-fWk zY^)|0#TWp?e_IvYw)?SqRQ)>eOah)uJ$9B1Gm~ENu4%=$myS$G7fbYc*Ah{6jh4faZ*bcyN~P!*$uNBWw+ce&@R+2!7kM<%Wk*bWxEGBqvdBi$zEx% zw%6EyY(LO`sQpNLH+v6zFZ)>gMEiC2U)pcC-(&xc{cW7j^4R`~{crYv*uQ8Z$4Mryw;ME_CaGLgzk zisZvGkzgznaY!mmT%C*aPr6r(7(CM5W2PQQEv(=5&H7{7ojd%;o8T$P5aGrbc+M@H zpq04R<0Xx<0qpSCNC&z?=5LV>YNGt+%7c8YkDe6z#rz4{iOWk5q$Z?cmNQ5ZYm74* zHN*Fh`(3a6ORW^uN&Q(P%n8kG_e6&(|WS;#7>3m+a8 z9T^`HACVjx)wC_N^B-XHk&GFM66;3Vl1r&MxtkJGT1F*#BnIlYOVwEZOBQ75u$1&! zgnzhqY*fqWeT&F5ez-#FB0ck+$*07xi!0Fkk!RV0`p+-|X(rkAC3d2G6-2;yUw4JA zTW$U926@-;uUG`-bp`Pf{nPT(ixQGrCe1rw_Jihx5KzW{D^@~v|L#4p zIVPDOIuUoa^I=B?Y5pw~y2M#SntV=llC$LBUcvzeZMJs%dYT?fezC+8e)GQNzqqvg z+5-*ga0#2n^&;|ZA9R*lFYGOKlnixU6-+Ov)2#JT17Vp=fWphzjv6Go!bFjvPX zkIvQU2_!L5vC+|*h}4L*Ud;SR76x#bPDRY^?)vy%vr??4X3ZFBUi^37i+91bZsaO4J^=O z0{u+w;ggXcWKiOij~hx#+EJ-Kdu-j-eK-&+)Cs#od@N4E(Mw5u8-;XHdhj)QfL)+0 zXG85IL0I?RiB~El99&@*IW@2+?Wo78(y$AnrrQ#_?^&{LJMnyY`!P!8u|k<4$L7vc z)jPLtI#A)gW^tk+`^b)6MfqNqWr?3@X3=GdO7*TS+jf?(YCOUPJ2+P3s1wURc3`b_ zCp)FOyPzz_fhy{6&PtH05$*_|otkNx*SJr(nW*kp{Gm2{_`HMf*L;W{M`(N}VcCM_x@ zQaR0M9@TE`v1+%JE?B#iTk5wDGRX^5aZJmz-1A%3kT?G!9%<1-(b0S;bo8?26cjm} zC*u`;KOQQ{J)|!7$}8R=>x@H&t|=)QJ%X}e(j`TM9Il{*RZy=bn|XQu1;yeWMGqWv3 zH=Wt5Cr$TAj|I-0I z3DC33-@OGTHac=t@;z|AP{WpISYDvIuB<5EusKb)M7Q36LP0yF8@nk1{-*9q-}O-E zjk>R_=bRzb%){5)y2HZVHVYeQhHN*dk}g16J|

    `ilKAp5PywG*OZT-wej#(qDO+>K^b85()uW|O~~7q zrMK@fQ<f-HX-qMoR0Q?ncdyZ{c9(3Gw2C<@1A%<^@yk)7}@6245o_H!F-o%2eTvB5oTxZ1DGFj-C_3RkaF%*?o*hbaY#Scm+K3&KQ|cW zaBdvTi5$|2le1^ToXa7d+#+rzOm8j{W+Im)lXFElNn9>#0nXTCvPtjPeEA+2OX2Mw6iN;YxO zM3}Qi4RC2CTQX+c=vFeHv7-mKl7&qiH>Q;=X%h95hf{)E(bIDn6%M8Hw$*MUdjsjR zxXWb@GMuu`{Mh1@agEi^Bh6Z?U4g?~-m%*4WR5bO)ou@Uu-CQ}VW(F|R#LOsWCNMLNnK{fX1pjFn{ck2c62}HK z{{OyntbY8zo3^NXjwoBydzQnGtf}nIZD#eh3AdN;{l-}JdMAC07cJk>4A#tIHIvi0 z$~Z$0w0IsAxK_QHs}>T8p|a69o8DFCjusk)vz~U#DrHB}9=KoDFBsIdboC zow!~&ef|p^3*?QsJJmm7=5xgQLH%>thxNa_Vw1}{)Js-(i;pMpQG>j9sy`rmzy7}L z1KE2BPeTgan)*U+ZGAPju6{RHf~&NC8n?dwJh!1fk}Io!!jxiZvqj`~2{RrQ5PaaH{ZZVRYV+j-djKpLy+ zw{hD+eJ7~Xr}K?Zw(Q-Ph{f{$rSE6({S$avRc`{7Yuq-(wjHrix{Ml&F;ZruzePFU zx~lahxS)nnKI*GkX^fGT$SQE?l%)htp|`n?bFZG@IHqQt6H1^p*MaN7_2CAhPaDfk z;#@daZUN`V#c?TI7FWQn<;u9t+)i#kcZBQ@5600ko6TxaQ(=t3QmGN7h%tr3x-paH(pbiP$W;e3e22otLS5>C&VA zRr}wCZSd1XW_!x`J{yT>otfXely2GxPPbwDA5vyET`+htiu`e_S@Le!t8G*K}Mnam~lI z5LXzk9eBSJ_hYz@!~Y3ff57cU{c+B|em^JRa>PZ;8zm>}z`5d@i_1;cfz^$d{Aj2H zmRj+uX{o=j*WyPq8|_ojlo=+zyBS}|9<)`~U#)*szp4It{f+ux>I>^7*q+GR!+efs z*kP8{Z)4B*+4Bjw-KgJPe;;q|qi_B{{Lo5dXbCjdM`$a5`9tjZSZzNV2!0&{7JH#9e<`sFO_ zFZIho=|uf`{GX$LIDmU~{We*1P-Wb*#1EQyf{7BdxUkSHeg7_%%onR2mhkNPPdslZ zi{t^NPz+d>AMybhim_*WXh!7%gm3&B-oRR4&BEWUKgnp*)c=R})zD*r z6X*x%&r+{wI7^z~(wJw94;BZw#eCnOe1Qw?Mef5VOR=@ivpiAXxL&QTW%VW&_Bp-N z6j09M%gTP1{s?Z#*5_Zq5%e(lqi>{cmJpV=G;D*d;chKamVQQ=hIww~R)Z&YXDLJK z==+8j^>^?@V`OnPy5haHj2eA5x-bfOqCEjikA-(HXpR;n~VlmdLy z6w#{NwVDE#Cw`1R;yS_X{}bbSOF`v6ZopNP2 zYjcQ+@$fy|(F&~;C=Z+C{Z05QWWFOorx0|`phPVBqP_4FP@!%9Nqr>s1>cP+vrwY( z(~ISbec9mN^3^hC_U7>OFYTv+!e8EPnqQ)0f_IMV_oD~+1mS59az>_yS&eiy=Kn84 z|4)vneNQOQEc~LpWtXMxQPc8#HzxlEDgx;fGWI3Yk*jgiC!=L8hWvVH~SHDt7|G(4~ODN{^ zwKUY9#+%cxrmP_*>Sm4UwGjVJ`v1xg>uDQ$Q`SEt4;V$koku)x(%4vhw0D&1AHr;G z1y(!Gux|KS%9%b{=;FDt)zt3?RrJW9hfy>x%x^5z8GRbhlltEpDY4wqH#7tbg?iuc zWU*OdfoYwwz+Xd~U@e692bSL}@z60{75&q2vX5Y+)ENb9zkwi@JidHxpkt-R`fU0Z z;Uv^xHfHHwZC<ov2n$7yi2%m5pnUfv;t zVn3E2jO82N)O$AAtnV?0tdEn;rB8Hj(C}k5i?&VLOVd2kvG2#u_gRcws%GW378{fYj|zVy%O0sRy8zM$WnmCzH^hgb8(VzP`9tdY`rw3X|u52p3w zJb1=h9cY*shv}^Q{wtJx{&SL<4;x`1t=~#-?QqB}?LeE>8(L>+J+%=!(YNn-zLS77 zKpDznp?w=InLpJNYin!l17A-8Qb*?_H1&T9$!OsVj9lT(OU}{otn@AKEMMzazsB_I zYMr})vSp5j7}$KzQva8~$mp@TVMD{QYYxtnM@hmKK(WS9)@pO_QdSPeK=6 zQ*aSuSLBKE@rKOCUSw~Y>k_PQ@I7WF%Gp1#|0iV7O`(gF%VctA87Ci#YqadFe6W0^ ze7t;$?IHOLTyt?P!sU+3TOJ@c;T|PVz?CM?fxQq{39btHR{3surTnP;l)Oq_Ex#$p zQH+e%6Zx-lQU1dAkgYBJQJRZv1>0t}PPXsZwzlm6_b#^GZF}1~+YYrIZ99?0{e|r; zTQ}P!c((%nX&Nl?(|8-`Q<{{{UtN^$tCx>$knO8iLwq#OS1%gpt5=w9jBS!_2IBXo z7tNP#o^7%1dfQFbbkY2HQ+_nut#-m4*K4rXu5nY}HuE0}$>H585U3ueE-+&^XZ zP0X%h_8dmjnc0t1yN!~*mEB=3i&+Y7n0*GbH(~a9%984pX~LHqxHGQBb5?*p7nKUsg7GiK%kWrG-AW~gi!5Hlm7 zpBe?d`WV?*hM8F<^O5;NzwR#!kOcz!QX<<9+{+Q!SJ1Sd1M20b>|5C_Sq-$kcVu^E z_hk2F-$DESQ1-p-5zsJ1Rx86^YqEOa<>egD*>O#Pi+O{4lY0xu7&Z4c*OJq6I?lko z%e}|7<=O)y1AGkEmHUY64s^_?K*jV08fE}Dh#Lys@knko^vC0YiJ8Prfkxkjn*kKQ zD{wJx&?hf~hJP97&aL1)fsXNkemQ^(;zBqR7sf@Pm$!wqqYL;_g}*&?&gHTu+(vFE z5GNEd(^}RB$boCHj{(o@7{4f|D2IlEE2FI(nIW4aTPRyBTLPSrJ5WNDLw-OXq{s@u zp9BA2FJ~HKM{z~ry4`PoZ)QBhcm;#ku`xDY1I8F*HUkEX7i=~M&v;?+j*TIhMaUw? zK?#e4B7_JcU?4b#7y<|(h!jX7q$q46kwW-EP(=8FP=pjEK?=!tPj%0{v5i20(xp1p zue!Usx^DHUd#i6fwNC%G>1_x65&E8fJWu#7zKX}EoXvB78!w-3>)~lu@jPqnYTIhp z+4XjV-PHROh9q*CetC%=TAn`+4@jc1&QYSTf38e>pW+Lp`SoRapzMs6PC|(>`@(P$ z-dmU8yR{t8t;@m+q_Hxrk_Xr2$mL2&W?d$m9e8cs%3H8A+!l6)?}giu(+|QO;ZCG= zci0_%h)>u3crHANKi4yObGet)hv8HF7I?v|U?n8huvWYnI;_)y_+I+ok?@ z1Yd9Wg(uh_LKu#PKY~6vnqE0JOhH#&6c&f2;p*_LyewV{zYf0%Z-h6qK8q(9Eo7l9 zOxBxk_;LBdrl*Lhdx_y8mhgqd{pQ@u%XKC9n=8q0t}MT~ns{J<{N_63H#bNeFj#(b zL*+L&On!5R%Wv)owfb=R%^fAbxzX~Q8^b%XjheXM+&KBoO{Jeb49~dV-08d_ui&5O zeslBXH+Qc5=9bHEuA4VxK-eI^xvj85SGZYzbGOQG?z{4v+aGPm1 z@Ie`#s1rJ1(U}}SfsnwavpDlaLJC*Rrd3ZO6veJ3_;oJV`TS=E7CDvDoNG%w{TW;} zk5Gqo&t(5BLId_an|sYCw8A&%a!2=GY=e0g;3IcFp&dWQh1B6XLP86Fhx=YnD8bL$ zDaYUGnp!)BtM{<~D?$ynewj0WPiPOX6B3yF9dewzQ`q}2l<+>xU4yOvL(YE*39OB$ z56qo{MJs}3E93W6wJKP*I(@6fTEI4I1KX_~Jj@OQ2im|;gy9E+Lv1K{xE&4-x8b3L zWJiLdZ8SL6#)9K)9OyohC1iaJILRi3GGoCMaGFg6XV?sw+r1{Ml73avuS)t=q<=D3 zonoher`c)XJevoeWoJ>_`8FRs*UkkO*aC2&Ed&?a;?Q6`xd2>d%fO55qR_(FatXNH zmV+zszHEV;yF)8|X(hPYR)g2twV{o1<~!ha+Ya7nH-b0Y&7qxf=N52>?Fb!qDFo zVJ!XXXwcaw=o`XF?jG-%Q2vCb&_WBuFcC)b5PEaQQ`WHxDyRt(N*hiozRh62Z`0Qc zezqxV1X#^#s|;Wy@7Xw|UMKfSJ<2^u`)zSf+0V;uedh+h))e!0^Op4ByilYKK5rXI zU1O{&ok6Vf$Xd-UF(_xMA%pSST6 zVuCD6gu^70Dr5gev|{w%z632G(P&ga7g)|6-Iu!+jbH`&J%lov!Akbmgv+_=3PLMm z)s^&xs|XD=xV5zZIzp>PuK{Qo8@XyTp*`#%7^Bxtp7%C1hYsm@HS~siXoLF+4K#B)UMPpk5E#evO^$MXNZ6ZOR_>glxBNV&~1w*soy+FHgFKrfof)%U4mSA& zP5Ecr+3?*tb`E%+od=$ehj|TcWf8cFbX|96r*4a96gKYpe*(UI6eAL^}U$?@N+iV;A*V%Pp0NU*J;0<;Ic$3`( z?zEk7`YyDfR+=ZV+uRqNZ5(eqb24mG!w98^f}A7AyVp3JI1+Rw9LD!a*Y&5-$EWiq zPDHLp)9Z#tPb-d$MNZCE&T+oQbV~e@{r0?ZdLI}8>4T|iQtCaYPTgEv8v;`dVSg%8 zcN|O@l0|37cCIMWgZxj;@@+DAkN0$JG=(9wKn#Omb`LXpa}KAhBNg&;JRQwFtAq-r z#4VN__wmKo<}4jx2iO0YMQ_?B(|?&+q()w+Dn|zr`fpJdeqQ87Z)ZIC)rOJv^Ygug z{Qmj9^J9JKWa=7YU8&cq%5%opP#RQEudDZoJjUOB=f-Q|H*IJ2K}~Tg`yM^drQ>7e z6jJ}?b<2n~zd5y&cfST(2Z%JVU#IeH6w z9Faw@(_qd>>Dxz8>OMk>h42J<2|A^ZKW?eIt?HpHjo#2X=W^V2$yB;z0gL_|&UKBl zE?u%DU9v7+vJ9VIO3!ijtb}et1IAp#zB6V;{8$w~)@17%^8hzcn)71?HoTiQa@MP0 z`{L;?``5&P73rIGbo@V&|7U_RGw?UA{RhFA9r!2sZvty(2$2UXRa;6*RbzARTEFu#8Wl#R82ZvT{>M|I$c>hU742dq?ZoisfH7ZdN=FHa0KI4 zv@S;Teiq;+w=u>NTCn97(Q1ncWo){oyi->bD%f_<()!O4YOG~=k+NSRq_Xu2SbJ}f z^Clt9tv>2|D`muf6L@F+E&k@Wl6WQOy_k9*j+_7XSmycA{HY@r!2vbtq;8QHDx}UX z1)(!#HH&rLAb(G5ygxx~Ny6sb81LztK=YQfOmkk}zL$0IHjuJnX@0EOv>)Gm&yAX- z?{!kU<}K&fSf|nfN8_3P4#%y6O#3#!HordRdQJS9JbXS==GQf-jqevp^ES`ZIDYl7 zYd)ss=j5sPlY=+U%ky12F5h-BrP~$pSbk1^USFLDA5S228|&sTeR71E#W43*xns zY}JC;tt5-JAdV}^ZY_xE&_~e`YV>UXGZ*JKL$-WR)0;hyJzt0AqfSwyPAMC8e7vct zRTGUgMYV0J@ur~hrl|3zq}e3b;xDB)`>4~<{9Row-#}NtoN|5aX*6l;aU5!qM9SGX zLO<#GtZe$F>eQ?!xUEu< ztx}M!g0)2-uG#6uyZWtv?c#21tV(ru^7XGHnM0Y2#+0vvU7&TatF;bxyVk+prFF26 zY8~v0S_k`<*1>+Lb+DghrNwoyqu`=bcq9A{6`tSM!;Z!tIiC5z^RnEyGIk8M%1mYm z7i76{jqF(Lm=l;aJU`2gt7UzjcNUzsFw2eWX2+r1p2)1?qAWMApdF8vI~(p>oaM%~ zv`1qboy4r;k}Nl_s-1wfG>13&f-E<#uRR8R_+)y~(y*+jXZUrSMhZ zTf%pR9|-?0{M0cmtiS4tp0riiDI6voA?y-P6iyS)6wVQzE}Xx9)2j99Lg6yua^Xth zmBNj}YlPc{w`|GwG>c58boK=V2XPgY)s$(Z^h$33GIgl5Y^`I;C^V*G1RxOnTl|#kxxP zsyGN{I}Wxv3ud~6nYy)M3tH9==Gu0L`@%zv=}%(={g$t_f8+~=_cs6Dt#-0c)J948 zX?P*qdzrIzPIxa%KgiOLveZ|x`V)VcrTOu{X20M6!s9NNg!1#df9f-Ks#j;c)}G6L zKcD@6jry8#NBda!b{*GqxEHxzo0vnn_O5c@RbHo_GqJagwY~OsmY4AS1vH7v&>&WE z#q&+SjC=o%bN37P3ik*f026zFnzhke+wD%yx?leu@gwHp%VSv1S96 zvzweP#gZ; nB)=bJ?4ymIq-FNgB2Uv2&*=KOs&zu`R`R=*>;39AhdTd%DIu2D diff --git a/docs/_static/fonts/overpass/overpass-light.otf b/docs/_static/fonts/overpass/overpass-light.otf deleted file mode 100644 index b060651a442a5e7fbe9425c4a7f0990b8ec6636d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69324 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 diff --git a/docs/_static/fonts/overpass/overpass-regular.otf b/docs/_static/fonts/overpass/overpass-regular.otf deleted file mode 100644 index 3a7c095fab33942b0597fcbd57fbfec815c9a2c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69808 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 D3Nx>f diff --git a/docs/_static/fonts/overpass/overpass-semibold.otf b/docs/_static/fonts/overpass/overpass-semibold.otf deleted file mode 100644 index 176fb43ce14a23251c04318345785f99bf52f2c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65704 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

  • v)3VY zeW@fJ+cT*;=OAnXY@b0?mlk2js$*xXW8AB&4l)YQ|Jq4oUEGfc^)2`eU zr6fhcy~vlZn_&uYnNknYB3u_Kb%)k3t(Q-&moHKJOI3cCD6Nu83R0C!no0zGIgDtL zrcBGN{7x&ZC@IMCR1_EGKom*}N*Z)X-^IoE915N8`qkWJMLGC9z)jgpRFo$+F*dF4 zhDW*Wsn=UZ{k(FwO!=KzN4&DSY=(k&SuVcrgs)#IEa)CrR<8@Ss7vNeG~!|hW+{!z zmEW1ZrsWU|g>kX**@|4?6Ba}Sk5VgJAwm}FWYZVcvg=PXTdkN`e^6B*8q`vyp~9D_ zLr`A|f{9&6DhO6V@hhDpmEY=(E>(4tty1cYR_oLiPge@6@X;%L^ubj&y6(6WXVyW-A*tqWb_}-FwyAX<`yLZ&s!ZKD~!QDW^1} zjDlCs9_o-(kmK>V@vR?VpyVpx7EqAqt}0QhD)jG`kf0RPYvpS3UCQ+&d>cr;?(S=y zr#4IKsuT}Y=`c{eN>bUNxGhM$@9HkKX1toH3`-oSTqP;Ih#lBNxk^;4BoPbZViOb8 zL}g}DTt)04crLXpQAv{2!4s2kt7}}3m>A_lhjm}*7~3v)tn%T(|KrCNZ+<}0{~<-T zoFXqXjxWYwD|0jZ7@Ldn*!HW!_Sz*WRB|8+>LU%8=1VK2HPT+`jC4gaLi48PZOu8& z)qsG2mH{0Dx(D<|e6ld$RKRs@pth5?8)A)-h%+j*v$adL?`uERp4a}M3)i*RMe7FY zl6AunNsQB#>Z)`v>UQf6>)uD)a7K4gZ_vl;d+EpN3-tHv7wMPlU(@f?AJ<>dU)BGr z|09qE8Ujs$%>&y8b_|RQ>=l?4m>QTJI5sdRaAx4_z(s*e0-p_B6Zm4_mcX|IKMgz+ zcs}r(!0!XE1pXBy1(|~G2(ku62DJ<76x1`QPf&bNQqZuV;X&C!`9V{HJV6fx%@2Aa zXm!v_L7ReJ4SFl+SkRfEOF_Q`)dY#48wS0hk>L)5ZR<-fZQbgAsj$%PE-ZY>z1419 zX-GYA{$abgqFcOb(fa2?MUQr$%Z+76=Vz>PpG$2;giUTPKD7L}~8%U*Z3#K zhPCZDN;cSy7STcIJ{FVg-ocTzgY~i_DL*!L&^F<)`3mxcVUTETGs)UB!)rczeZ%?} zZF1vREXjo%_a1)p`S*70ynoh9_P+Y!(n+2XVL&CU=9CB(t>s3$+HAA;fAQ|;-wr*n zW8?9Ub`|BWwEeV6d$w%gJF+oMj_B2+o!tCS=aoYHS0$g9_76=QmEV6r#;*5EZ0!rQ zkz0RE7R|zpmMs<91Fvm(^I+)f#V_W&il^olZkYOtZBB9d)S34NVz}l(qD>r$l#l4;uBV6pd3e|A*EZXX1^VYJ^46t= z$<4Zgs)N3d6+s7fu6$*KeY`#;Z-U(60ow&J$Y)ml&<*Us(U@7C+tlOGkV8fm46qLh3l&95?SKh z)!IQiQ;pazqIAM0Z`TT=PHrXkYX5v`&$nNO{+|7-JisRJ)z!$yEohakzx=}RG1(;} zx-JaD`-Gx)9xr(N&d1H>fXN9)k za|g$r4l~w>mvrJ0Z(ps9aR$qu%7ewHloyZG_S2fgBGFg7e97Xa3-PmH$0dfb~ z@@9vNLv7}7<%qW8q3=+w>-Q5+Q8oU$(2G08ov+J!naLp&2XyUZGg*GuZQP@E?>ac+ zc$la-D~5~s@5+D5K575tcWs2OXuS5NiP7LC=jS>eOtK%pV)5*~|Hz?G zp?g!b6K!7GI=kv6TSV;~%S6{xYut9R#v7_#H};A2>`+-ZN^U2&v6-eDNYnN_abV>e z`vP~ow*2VPQ18sh+SU4juHuMto9Ufx`%az?eK-H*oV>!~amIdDDCHvU(z#0(EM2;E z@sdWZMBfa9QM?pTQn6;;3(u|HuxWK=nP*zn6uVKoc<$WA^TX!Npa0T4Sf# zm(wf71DAfgY?S+oMcVnx=PjN$Z~lULjatb>sQGgjJTyP_!6oyTE?K^K@p7ASZRNG} z{s!Yz!%FMP$p-U2qt|{}eqJYD5SO%H)i&xZ9@EP&$X{zsv#Y&ptBo%%U$bTH+WGfw zv|ZFcTRi3Q+_2&4o@l%Ao4qf;cVxG#o6Wdw1FUb!27Fnygsks2Q2E=V2hUx|c&q#-StPF2t1>gdrckCTDFI_-<$ZW?My)4)aPG$^~JT@x4%^BEO3|S*-Z8%W`g=;CoN*I<<6&&tC^h4Grl+t?CkFk0H^y3J`nJ>RyeOndBu&8M!0 z8eLPJ({o@{MU#!9@s%2v(1B--C(Di6M{bdIqLKY^8u^Q zG;c!wgy}N_jT-N=5IM`M6%G-hm7DA2j&hvVtJO!2(O&OXBc|y;{7`h1-_WAsQz62n zlOOet5u?N-TDg%#fElL-5HOQ8>?Fp5_e+$+F5vb>=(j}*o{YOkFnS13NuZmd|dY3ANA zlZX{RZ3)~Wtpyk;eTs;;9;=yyx-CYlT%@Zsa|wksHnKZ#8+BR~ZHK+Ey5h=kEUU z*DvorXB1;T+O|5QV|KOprusmNVgDZ*W6g6Ap(*ktiwy_r?UPgYosBIaqUah|o>_<&X3C4VAzDf~PpKGB)R8x9ynu&2f&f+5$x z8{bX+W?5D6$*+vi`~`E3^4z0ezhjtTnm}CVr_#V{9k) zG0y!QW@N(W#@VZBv|yu1(urQjMBvrm(*>6Y*p1a*Zm>uZc> z#fG!|)$_t}UL&%M+L=>5b3I|X_rI{kZlqvn`)de>Y<=~{FRI=zc-5 zFkA|$F_u|P=`I82w7ptPt~LfQ5j*9v=Zw|M3}=m^vv_3x4*YQA;FH>WtjR`BoAcOr zUBs|O$qp!Ibw`v_H*D%+Zx%-x*g0N7XTEfV@dCqP0i89hRZfgIU~^W72Y^^m4?3_L zXr--V?DW3MX^$6M-`KT%SJ}&bkJD)mHgk`2I(j_8>EQ7cjvhJtoYTSK8BRxr*vY<# zvq6rBi0A}6hhr0!9waJbbhz-Ma^(CB!{ZDH`sqjl{~uM(4puV0h~tqY?Azm*04FAV z38(%1g$&O#&_Mw9?w2bkk`w71oQ?yWwE54mA3vF~X`BvCwkb!uiy0m~!gEY?VUHK51{|C9*iV0l;prz1G^S|SRL&|m9=V`>@*T=a_)aa`%juZoAg4nXoD_WbdH0ZtA05e7l{v@y<)G5$H7kYV?jpQ0l%Y$EeBjGt!w8^$j%>?rfEIRBRMFB$)u@$-ydWc)JY z-!XoP@n0GLk@4>t$6plqf$?7$|0#giF#adwe=shv0nfP1@U$DppAfi4$7xbyCI#S} zO_Bofm&lk7~gGU-k_gp(XhYC})oN#RV2WKwG;wPR8&liG8sGn3jfsUwr3nH0tFl#dj{ zq)trg!lb+CVIQd%le#h~fl1w%l*pt$bebpiWPE@|>dmCSOuC0j{h8E{VH;f<#H1vK zKe8bWmZVfB-7QI(OiE)?29t&}JpLn%pof3(7bK)?hQB`}jbqYiE{$c<1SXAV(nK!h zacL5l@|omfQW291xKzxf$xL!Hsf zvp8C;#X~lo@eoQrpT%G0vSg65q)Ac<{%FM$()-efl2>EWR0QyVn1JH}m$WUkL$zzP z2epT_N3} z{8;0c8^783gT@z3-Asw5DW(~wCr!IeXG~{JKbu68fF>iF6gQdHWNDKNP4!K~ns#WK z(6qGaLrp(z`gPN*%?36b)of$4Z=2l+9v-|U_^sg6!M~cDnH}aBbANNO`6=_;&F^U5 zx_Q^;@y#bSFKs@j`D4vDHvhc&x6OZRe#2t7bhD&b@+`9~>ns;ST80#a?7d^y9qv0; zwFqpH)naXnt1YgzG__1_Ij&`4%Zs6nLSsU+LN|nN4AY182+Iyz9d_x?A$Pj&oO0)i zJKwk3tSQz!>pbf*o8H#THo{hFTW)*acEonho@_sDziO{`Gt)TTw7c5Mc? zxxdY_Hf!2!YqP)2i8ep9`Bz(g+xBfIwash$PTSLMe`(jaUAuPu+l^?qtbIWHkoK+G z_ijI~{mk|+wBOVI%l5S$936UfDD1GU!}$(3I)-=b+A+D~#E#QDuJ3rJ`c=FyhusOY5VQPD-w4@N&9y+8U?^q-xYcIwjU?oLxW zJ=5t*XItmk&PknfJKxv&$<8ly-rM=z&R@h>Vp_*^i5VL6T+FL6Z^e8T^G(dPSbgmL zSUIj|Tz1^NxOd~ub!pKhrpwSS)4S~La$l_3zk!TK}i}UmnnQ zK;?jE2J9Jd9w#eP;+Mvs9~d++dSKeXrv_e42u&zUSeKsB2pYJJiOt*qCd zJfJnn*Vk6^vo)HtAvNM--O<;zSM+J)v^|+@V5~&kAYR5lrNV(5?RSd7NS32`XZ?9y%dHXDbc~j~kz4)^Bx}~GR^zK5@ zL+(_0^|W^kS~Wh4R)g!eTBx*Ij#dlN$~ytA&g#q^FCNsJ7oN@*PxsTCJI=M57kaF< zeXp&4mmm8|bIhA=S!EE({+>mE+bX^}YhE>HjlsNnPLu(;u2%E7Ife3${#IP_w;>I#e^z;siG01DZ>8~0v1dx|&7MwmmsMf2fWVb_(&!?nH( zo$l$2T3M%CCwgjy?_!fdwgYs!`?^t?NA5{A)Qev)T9m4GrPws7y+|EU`CO&l9DEc~QZ2%(m;YkkDb~)meDm?vHxJm&l}F>X!lsj3 zimsd9Uh%=ABQ4wLN*$3TU+Vfak`&~4HoTd%-cl!keX}hy>;djsa2z< z4GuGJ>j!&onzQg%@3Ly{O$RZusB~XIhb64jCew zG{S36i|{YT9ZY)3ZvN%njT;Uh3;jLr8`&&t`(|{XY`c=L-MMz#s~?7avORBT=ES_a z?b&S)>dfE&xP4S=?_sV1>BHB5I>p{0PupSpxuK$Im}w34zspbJ6A=s<@`lx5`!x){ zr^|Og#dwFyO?2|VYD=_3yp8og1;}&J5w=1;f%^e=>#BuAove5fh{cG2D|C1;P-x`# z8TZVnEU`Z;25H5<>RPL=O#WGDbF?q7-?j>yGH*@j(S2xo$3D61o||kRc9*tf^GAh3 z8)hm+uS?Kz75@N?dk%~{ijG@d{SGGxVX>EG^N`VHQ%mjJg!PZ(B5+k;wO(F1UN*`J z^1Y#Q^cS*0+-0i{=$rBS7hk^p`k6C_$Mx!yISyMtvEbg1zj84IJq`(3Z&)Nc?-z@) zv3Yl((AE~U7T4g5<+Q=_fQRL|fu`9&V?nhTQXLF5`u-tYfAj_Ue-rNjnbtri_~JcB zlD62*R}OF5^v3bfn(kl7&E@7j`a}-iH1<%D&HURS*FD2wi-NDj;H1QS#hV_GGI8hr zgS)oA|Nid6?9me@rP$5C$yWmUWbOO-qeF+kIP-Sq;KYnEz_fJsAEMVE;=w=oJ|T%! zLehx-7|6iBT3fN)D`LE3ULZDM*I9ax z+I~YY>;9GxDzi@CQ`ZMs8Lqeidzlw~AP|7SZY@5L>m!5U)&Wc0tQ@^ z?ed)+yI@znMtAXz{a=2(J!iO0ZYsw=A!me|e}7ZTf71N%VRG*_2>7s3trHe;m+16e2f2ye zy!$}Z*uE3y%v-v8<dciA@Ks3J~h{^-Em@!Fl0u9XwQWS-z?+xp0$i~Dx2*|nZp zIG1j&+!9v(ZH;IxddeZJo!G#Aw6QwLe=Tyo<68!>tse##obK z5RTCiQXPSt3xv5<~dliTp1m9TagmH}y4uW8kYcGn@=-GWe8{_=5y zzs9a@%bwb7-yeVW;MkMeGaqk+z_3se-y5Ez!gowG$_h&(w;2U*Ve*|3i8gP-TbKq< z?=yacedHHCvk&yv&YwB`;b~!}H`i{p(!Sq&wC@*dHC6h26NT?bW+QMfgoV0Ny~W_Y zVwquui(6==!vpcl>{ixS%M3fbXEkDTNR3X+y_T+(H99%AcGkRU4cW=h|Y87#Y&qu&&Io-}{EfTOJ~?e?CS0CB};Hl)ZF^e821v_fuYs zmA}JA?_XNf!KULgTGP%lgR*Ye64DL9J*UwAP{1$Sz*?x8oOFrL_b$`Smy;~sWtVD~=}ZqBUK86iqSX6o7lSFu`Y4@&%<^hN zs>OL-q}9BywKZk-)ovHX<*UJ`))~YBSkF7Y{87Yfgxz=5GA?iJHk=-m>0ey2eba%kGrQ7c9+{Ke$8J*h#yNJz;q0R7 z#@LTBo}F!Zd)um)VHu{)F_`zrea^KN7TdE|s|@J|j$Ql(nD^G%mT>HNzhuyeDc+tI zp}!>S-`5Sb_Us?~d2P=cy(vW=dseVThF~<9USs}JJR*;^%(TLLco5-!*}<9y5$SuC zpPFpYoPu5+)umYFBRKET$6LkIG#^v8RXGv5Kqo?S`1RK<<`ccF1EyNBbjw9Vcynbr z4W_fa)Ea!MMvS8W=6%&3DjBslGi>BNGjdAo<}cq+&RMYX z+4t4!uN{7G)5QKZ`JEbZP=E8%ltvxm7;X>3hY?ouX{Xh^C&h|Qec$>z!Z6c79GP!0 zpWYdHeXMW!Xx@`=#SI@B55M~S=Jj@YfxhMqt@-q|D9n7%B>l^!`OjyB$(Fm61M#oh ziDvevuUh&}JSzClyFWht`m59OUa(`OGj&?QWIS^qPXncT{yMt~6EtrlTJ1ofHp5`v z_Uunu^NA8<-iw4U>M;8UQT+pd>krWb47ztVR?PAvvwsqoE^)zYG@}frLhJ3H7%)YG zsO!8_G@>x%icX|?mun++a*+JZyy*|kd1z+KhgLlFgk`-|9?=qq0yQrTw3JgeKj)-~Fmu9u_F_Y>v?SSi%t5o_&QWl>veveY1tdDacpwnnpq z41{^{`O_jg^d0^FwOh8^p8al?F0XRSe)|!`kr%{_e5DvaAuzY<*cUbPGU2l+QU2CD;@Z6fMJ3^0V9vm_xGkZwx>cW@HZJ)hq@l>r@ zzkbb{b?eqtm6ldjdF(Q;9rl1>-E!-Wt2kmN&*-|S5kJdwEfcLT?D*sH<40aO-?9VF z(56hv9~34x&w^oVDgt*Q)Ny>Wt$4&1`;WV|C)|Bc$}Pg=DgBitNzdbWb|QPGeZ-Jh zLy>j3_1Ge-7)?7k@}tQT*FB!|npZZupeVzA49E z-wb!RP&xU$P_wMSu#_5!r+l}~zr|eN+{!x4AbQhokomqN*GpR&aQQ4*SMz=174_OH zc|Q%u^^eyhTN#q9AK@HzPxaIS!|-Zaz3*k>?r5t*V)LvyOKQKd_-*l=*48BJ2N#_e z6)U}0)OgQ#wwiZ$H<*@KDFBMc&z zs4(ODESPFs9U>x#INznW5z*j!=YVi)x`8OLzs6Hw$Ok?D6j}c1{}5YSjm8gKpQE0- zTrZ_F`G>8dxzbhe&1(4okZgmNv~Gy3nZ8ug{7w;Nop%%vklxYoZY!x!yU#Fy4oKd4Zu! zk%kfeaes@ct)}}Jvx3~}6>-CRKHku~_NNHL5UYq*WMtNNGz&U1-`C!1Lh+mbUvJ+5 zA4Sprzk8P}*^3c!UVzJccSscwsnUDzAkvG3DoC$MAf)%+2@rZOLZk>HT~t6snn)*r zfCUU1bT)26{@-WzE(wTl{eAwspM7?BcIMfs&ph)y&&=?;63A9Q?=Bm8oe4y%Lo!|d zyHdM^_IyWd;N>sF=O$p%km+dbcp&u6_Kve105 zr%V`$0pyeG-tydh455`G{r*qZ9!vS$n2;Wyk#1%69_r0cl-Bxy!?SlD47T-IIWcFl z!~8?f2KV*h@!@e{_NYPgI}e;?^n@8*exXOccnZVgp=jqT6b}pYzIvJoM+5eZ-|pD8 zcID24)`B+MTWzy<*xY^nKI=yxu0D2h$Ls~G?AK1~_PyVCcU>Pv^Y*}+@2(s3@eId! zzgZJTSQ}iNdU2Zl$_F=R54H{)vv6Ry(L2`8v$yZ18@%VrghxJS*e{l*+d8e4qUWV^KNJvPO11C(hBaN|49Q+gRZ?W@=o!1>f;Nul|u%l!+@&Q>YRbW2?oGD&;cj>%m)1Ib*6w# zEa+ZfetL!ieX1)o8h-ucqtkW_gLb|@u#fN50gn0g*67Vof7#Wq&)e@z91*xUF?q3L z$lJQm4cj7feb_4xZnD>JjrzL9dJLV;tlNCzw3TUETv9w=f4!H|$?nN!247?e7nt_K zwTt4HS6H=gS^cZ*)y_7h`Zde9tnJtOJf$rx4C=8ix|1t69yw_JYRW0tTei}FtMsxk z?L)(%tQoVXFP=Th!Es%@$o5~n$WiI8$Q3%MV160vbxNE8 z?DA!>%a^I?Qp321Uhx2RiW+CTLmxZz*N4BRfm3EfEiCC*co?>M4rN8Y=a0{Dk zV$x%_=CQb=pl}ifVN;o8VO5^qh8*&ZYIzFkVYl9`M?0>M>h_hQ^--!+YX&>IH=Z_U zRhahN>FWm^tv@;6hiQF^20ym6>3=XU@5@8iuAk`LWw)ct_lTMs;aVZ7tQ z?h{{K_qq1v@Mg{Wj{vWpf|i$BDntC;DMM^f9m8`jLu^o>S9U8SxY#`&#ugB9bWlYc z8i+VFs)(aKL>$V`T&fWdA$_rJa`8$h#y z3NS4FnccL2)i-d1$ok4Ar9RuFQzSi`QUtfx8?o9wmD+lFX6RRqk&6h&hx!hIZSB-vB`wt5m&T*c3c?V#LD@ z2llL5wZ>6@mu1w*GCN0RUVVhn%{I({VreuKLx*&*fc8w0-5~-VhyowT z+E_3eE&8Cg4ARgIQV4mzR$dE1R#m<7cG2+~Y!nd_)@6W*8wHC>teAmYd32i+LDE z36q0x@!^0uTN&%d-Lm19tqu_`aJ4KK!|nB!WxbLD*$U#SDSBjKRb`)ybs1Yz*HuZG zyJSk*0_G_4sqDE`+9J=z5U!Uu)9KB*GiX+#@Pj)hx znZ^6866>K}TGk-g($~hm@^%8xQIhOdm>6V`}gim^|(be%RnKt8|-Hc--J22`-lW3So!YkJRZ`Pi;Q7 z$1#}OAddmlzsvTri45)fP9Hqper#OdEp2_2>WwhKcbNS!vEdC?-Od6rvB5mE{M3e` zS;|yPo8ezQg)cJQyMCxwHM@Ccwc))(obS@z5Ah0>@J^9mEdfiwMQOj*)>Pk8alz;RW^Jsdx5OH91<4> zaz$XXZ@G}GVOZ!p4*J}C%zQQfDhi$@vPxQZR-TF?SAvvo=yq6;@;Tl-=cuNg$07V; z8PF%{p`m)VSz@tlp#?_!3t?7(i$q}<-}3>jf%@)l&c0ijUA&=zv}Y(EK(HPuHWuv~ z*kK5P!S36(1-2CQA(ngJ-DB0!BYG^C*GS=LvaSi2L^i797Apo^-9I{-&ALfKrg?6#A6Fvp;g-t+6;GD1{dCH&{U?7 zCL>>=;R)W$_6`SeJ*G?PCBxh_GOn5Pj+9a`2phHc({Uv3T zlJXJ}Tdz;^*(MrRh!|FA~{Aw2hA_bhQi_H5B*d+^m%u zbHZEcl!^tcq9N=Cb4QUB)nc2WPuWbGh(V}jsxpNXDQay}jF!n%$tFs2QKEF}HfwsD zM$1P8D4shDT=Oibs%P_OM`f!wdv(u~D^qOT$x&pzZW%4Xb+kmppk=DLoQIar zB?9sriP*ao$)+^=aT1nPNLph7DD$%xh~x_d5k<25xYFlr@a7 zu~@>n@L5ZuOy%6=352=$ky}+zvSZ{^HWa3T0Cs)W3SRr$=+|#Zlb^M$Ve4;``;+gu z;z#^N$0=na`h*JgU4iyHUIAjIRJk&`c^Y;St9yH;v|M&W4yIUk& zHYM3XtduT?5m~tOHu;08vUmsn#w+2CZ3lK9y`Ssopl>#F=+K@^;FU)+g^Xf6Q|{!m zPxHkqzq1t(EPr#ya^#cjb-9jn-7a75d_lK5H*5c4>%owH{<-$^=i6TG(L=Xx(&+4A zK0`(?o;%6W{hJOQE_T-WO$r$^+&VmS%&Pb8UAkOtd-faM+}!=aM||?#+6+0Bmv{8^ zwd+UwG;21bFZ6)X=v#ij!#h3JyKv*XHdazxgi6)b_ALo%4*x+m+YtO@7q_nguX(pc z)||5G2};9;3YZGNQ>ELG(!6tz4a%>3kE-+m64M|X&5MPfz$7@OKZk^xwhPD!HYyHE zpmuk(@;=IrGZ#;tcewi6)ZzgUxs{W@waJu}lX6Iy^cIC|?V1sS|1r&-4G;>MZ_6Hp z#$i5mV9)8i96P&hfY|?Lx#?(Q4CdQiXN(=ye~JWmZ+7wTCa0lc)gX%{mdw)yxz`mc z6(k?VN;S}^N{2TvaH0W@Y@te7v=fbHsI)~w4R^A4x7iIEVJXqYf#C9vyujt%2A6jP zT;6Rbm$$x~MB2DSXAQ3_h1#GMMfgRukv83@(IO{=&LG!ODJxDuf1%!61Zv9 zQ`QCFx7U?a)dWORkXsz359{mO5{mLmG1a3q9xGnK|HD&wtSIkIo2m#r!y2YYte6{a zwdw_>V>ylBqhM8$LV_5sm0;o%^Wk#pjv%Nz4m;Hya`(c?BWy)2ik|sN9VAr;^X22i z_ni8SgYqJIm*vZQ{U7R~su-h~n=tbmhK;i)K+Ax6cXgHeN_|qBI29>@?_)r8P?>bc z(r)yH+duCA{OZx%>9dzRl);8c^Cm4A?c@25?arNS7^_hw9*R2L5MsG+@3_=0?o^Li z%i`XU#(`ko2084Ut&+npsVbXgWjYGIp=};2^Pz%)*-}?9yMK`N96lBn>?oqQBN-Y!+*{&ucH{D?5J-m%7^c{RAIY2883u-fC^uiYU-y)uKn!T_?O9f zQ15=O?=j1F_<$w0wrXW(w%g2`_^7pam=B`!j2$Kfr;l$vy4A6L<+hcpH*`N=d8Ez! zXU~`MQtG78w{O;ARl@A%XM<*bFlH#4z@Li>8(Y+wp-PNi<))B(Bvw{4W@HR zwlwh%wAN>`o@aMq@d`IJJZ1NYdu(9A8=xKLz3gMk@iE|O&DR#$IF&yz)rT z+(jzht_DUON9aq;YYTGcF#EVZ0&aUQ;F%H9_Fq}E$1M9-lEznNm2SFJ)x(vAwV`VI zhM9rmJgc;c8U7Jg#-CiP<_8@A9tO+{WB&Q0FMfH(L3n!cDlkx#R zy;L2i;wg9x%Qvt4=@RlN)4M>Te6F{x)I8C8_>2tlB-L+Cx$Rj_KdzOM_<|4IX|%;(mbPCk-90 zpx^reLx(F$rQ)2i=ri&CJN|t<@Bs|@f1rd8&q(}p&;c0Jog6+B)6By_Ca37 zt4XioM=hkW662zOXlDzb_r*?7Z=j5P){=a2^?}m$SvPn(GD7-#yabAJgH@Vfn_2X< zwygu4mPkgrSp4G5GPuzQiw4bb(@%s}P#@zRw3w6`8 zPPO45ad28H`%6jBYS*@@cFsV{hEg^cr@8^{IG}}j-gQi!egdOre~F#lHG(WTz`BCByIR^R%uUx`LU|N z{vF}+(astb?W=9e>uy6dDSO|hq_LAAnJ@hFN2*P%0r;PCKV`4YvVELN)WW>8+#qou z28lbz+2kEX;zRiNsl$NL)Ci`oA&BJUtMT%=Z_)SGm7y z&T*+$o*m~X%gs$@Ux9qM^z_Ovt`IZPi-K<-%iDg-XGU=2?@`A}R`Mp^`dbwDt_H5% zMd!1)1j0q=e*>YfDka;9%n!1j6!l4h91P{TQghGQe~87ct;Xg4rqnq^U{wY2@NXQ@LV zN;?Qq+6{=(4wi}1Za|cF&?!nwme?4MC>_lK7CK8M;^u+4XYnjw=`gAYx8S+XDm_+h zc*-?yb%(qE>tusGnQr4YsnWt<0 z2K#@ze#5r9d3~5$Sd}3?b>`cRz?M(5DRrSWf7oS#-1|qbBfmenGq(UgpGiNzg`e-j z&!427IrPAq-*rcqP4=D}`seJjZrPNx@7T7v{wwU4ztrvi;GNtiK5w)c-muZ>sb9@> zoSSheV5D{2#Kl7gPT00;fxTm&tz%BkI2&GNa1WjNmg}eB56J2Rzg)^Httc@6$qhe7 zD+?{=XMa;Jf4a(L0Rq!haxyFaj8!@d9-fT1h7w~jIo)=FOt`#Qbis@}W|?iJq&)Qn zr@8fzZjJnCp>3_cZ#$j&DPkfc`ElvCFBWWCAh)~k1#6QvcVO{D!%FinzP7a==@Jv; z6EYl|lQyQW&B}gM*?gmo)Nj?8gMs#eoz=wLm}Z+y6d1oOwHm8M)J%y(EXjz4(DrAQ z%pB^F~X({E6y7!dAT<8r@Y;!(KW>gP}`{-h$r494_pzE6}dwPTkGP@ zHEdmp<8jXD{+Ja$rzM}UnRpsfEAN0>IiA=UGOX*v$yH0-)*uzvEJ6 z$J_RhT|-_$E@TNi;je`KS~#&e#2E)m7h5r3{hQ@h%q5Cz!IiEO$8)~GA9w-_oR$|` zNi<=e7J`2ksQ=s^f`meVvYcqEKgAMC`awim&4Kq_5hLCGMLz0S2}{F*Gk3^1PsSYU z#U6gZUQmYY^II&M~dShXn)=wsQ(39_egmm=niccsasLJw%TKea$CD6-B=m&UCPaWD z+e9PR2N=2TM7+r_cO6Ww8IY)sMqFVb_AOX6;h}TVnS238i4c+Xl9DjTLKSbb>JXUk zT90}00m~=ti`-}2k+f~&ZtEwLw@es2X?j1q*|*)nu3t>D(_ECd*d@r>>tgc%TUlV_ z#yTB-QyrlFxdi88-3Uoka==h3iA1xCbx=&3y_8iTSAzMdGHM!vwkkAS?vMwgZua&A z=v=;r`tAWs!rZw5pSBwM{(=wYLQKD}K~eLEm{P(L3>SB<`*h#-SzT1a3*p|^_n;c` zy3B?vt1`BenwBZQE(m`d1p}`8ju_wR{w}&MhI} zw|~=;xjPmrx$SMg6i>D=_wQ~ny91+Jd;6P^t-E)GC%gHUV*j=kbGNGsMtoimEyXQT zGeYmtH27zEcb>?q6kG#UjSaSZc5LIWt&SPr=w|!P2=@2+z(3fx# zOBYIlCv~kP&-`V!`xoi|EW){d2gM>xr;k{Pz+9D?&6G->fFU0Cyy0R0MZ?~K)U1P z1b|#1+Hq1vlyNob;)$!LuVSf<7>Nx8p26QUZ<>=ixTwbh$(;3l7jp7jw}0+AAH2!& zN-nS^T>-YN?+M!#VEg!cVDskb8Ua*0Z7dF$=BMl?L~Sv-^A_y7Qr1c411Z}jxUaL} zRi3Nt1FBCbwV$K_6`shwm9)TCUc0jLhf`xtg`Qk?a`VYer}~{*dNTB+?EyXP`3Y~#X$jfvuF%aGKO3HvpJHLD}t8<1Ox>K*x4O# ze?pwSWaWw=xCO(_tPwgKZbyi7Rscy((6WGqL4gbHX15ALQFrf!*^5^!U$&Hx0|y~D zR;}va$P%#B6+z%x9PDqGr+HJPbCw~}flC$wHzHl3LWiQ^jevYH#d-yhP^<&&a<>Fa z0Fr_~uE+uAg^Ppm$EwDVB6B-@P*Ja-w3BZ{o99RN62d_FfoOEl2}4OeH&hGVj9A|~OsyW+)WUWck?rZ;BU`qCuZ z)mPN1yT0Kz^J>hn-4t<^RYpY>W6&cviC7?Yv8k2PQ(1>k(p7N>tf+5lS>K3$HsvyY z{OIaVm+2&0)wwV$l7h^pduQNBzzGu+*Z(_=^-n<%9j(yQ=J(bmL=SLDJ3P>B< zq$ZASqSVQ{D=Zr-$C;SJF%w>{-#NxprVqDKs@Uf8$zq$IOBa2VuCiv(T|3jpHdEpX z4V1LiKL8z1+)*TMHBTJdM5&wP$7-ty{Dk#ln~=hfsf{6pmyyD<Q+7EtHo?V=GKJ zXT34+x2yM4eX#7yJjafO!M}qQb19OJXx)?F>JUOU;N)hPv5?X)ME$t{87Dua=(TU|m_Z z4r_-cr&!aXQXCGt>A7F|*_RPo-A71_Ee*}CwQ)Ryc{tHp|X?JTJ& zN$H4syMYoV*fdTjk1#OPxX}+K88_9I{VR?JsO@p8WmYl_e@Nm$3zQu>sc?<9u2QO8YdEV+xgY=7uNo++|N(^ z?yk156!5vV81=k%0miASujN( z%ib%U9DK2?Ha5z7;ND?i6~DRk$M5GlDi!QS9UjOX46KtPFpbg}6~u`rkE1D!hMluB zN(kok<-+Rs)vEU&*#lU-l` zomoz;|6<=hd!N&~e*LGkXl7NgET~cwmWjCI>~?e7)gdSBO!rx+PhC$=wbW4bunh*2xnO6;0G<@7BR9QHbHT<)d^(-G@wB8mo3;&91e!fMaOYYAK!5uj!%tO23P} zf&t7fes@_zpe#fB!li#JL2J<;ZQmVFORoin|%Y`JKjcN%r9LKD3sjF4aGf*hf zT^hAX4YrdTg-jI{=`LdWT;TbER)_US~C_8S+=lf$ff1H!LJZNQ7 zdUQt0mZ-EPTawe39}dgR*`4BwDS#Dk98ymdG9-AJQ5tm_%iii)381`A} z0&C#3h|p;Jtgu;&<_8$V!$Ts2eHH}dtaPkNS+Qz;#EMnc?3A3$CCMK|uC$}w#ijVH zS+*)W!?Aj4Qck8dB@U-OZgteEh}A~3&`Yekc=y5`GdCM2?(si<)VkcT*Z+34_eRX> zH7Q|u(nNbqLQIS`JSHsE-yXCm$bWG_bX0UyOhhPVdPW6=`bGH#`5B`^V?)BMfr-(H zcJxSDKIV`*SZnQIy9w(ZOZ?LP7Fy@b3ttcsnUEN1$C{=~7Nr=Y5@VB6tmdi}1Yv1b z*3z8drOWVE6>F^}g9@5M;J#A7a{1DnX_A$MxO2A+dm1&^f6a;$7*UHS>jg3WQS)Pqtik& z6Rk-}@hK@;nM=}RQX^CBL-vMc`sYL?SBXlFOr^}ujLC{$5}%ToljKn|+F-8W)MK0h9!h2huM>(k|L6$jIoIc@rgc3i3!OGj`XC|WNTb1uv)h*-MV~}Jt-|IEiKuY z9G#kO&C1@Gw$u(EDXEEZiHX*P#KeRI`|26Gh~(6$B|e!MX=!PWrI|}Jm!}!il9Lls ztqE~)iLpMBG12icamFA&zu*NvW_O{3usA$DBf^oPPfm(W@>#YlC3UGIJ9Syg(iCG- zVp2kiH7PD3)*cs^5a$yc5g74-BPKW~da+N0J|ZeUIoc7O9F-8d)QD0|LL?Fr5)I+u=PlAOh}l+?1rcCq{SKb_~^(O3?afQ2%*vI zQ**LbWv@w^wm2#wKE;u)$B?6fkeU`Bo#HSH9V!a3d>+ZF)!8|jnc-ongisVxLlT1K zS>s}2Vv#JkXoQH!_+&?Na$>eMJ3K3xe7SX46tytKKPxRG%#j_rHhz&cIyxve${uM5 zPYg|sv@f5RIX7jtal_24!S7ka5`!|bvr@B@>8aM;3l7ZP3h9q1tlqhBdG{IC z;F!ReFnd~LW^78BF)1i2HP~lSKv-a`BQ`EBc23Of0DElO^hMTy=;(++_K29oRCa)Au~qBED!gIiHeDJ#4Qh8WHq~?VnxJ&RpHSVp2({$ zDRHS0$#!IHJhC@F(W6F6R6=a5H5SDfhpa;h){C~p#3v-B#3jc#l2HT{wu6wE92P}6 z-9d`t`MH%GD|E;>Fj){zjM7?Ti( zrDRTLuo2>J%)Hvh-qy-vU=5tW2B7<^dcW2ut=2jgoSSua?$^f6p?*u}4VwGG_|bve z2l#xjXx7YNN9bH%MHBe0vCfp16I)o7I_zD{$o98qvJn<#L}ylOdlIU8vSa0O-J8dm z=d^P^KQOn0SN1xVPSPcZB!!1qM>JL}3glhN=y>+d5;=Vd>$>El<$7i1azk+Gs}Zlc zneO)0%}YGo<2_7|r2^CA#Kd3^kAh^6S6Ietg*wYwv${lkOYAM{j}<0&VUwGN;vz9h zJc*5J+GE+eWX&4vIeJm^i`EUx*1d(zX5Q5XXmhlywR^RnYHw(N)fT&H-0EW!nYM1T z-Tbg|Or+aZx8rVKxIJ+D&Fv4j5}jRFOV?1>RM$z@Pd7sss!Pxv!BTfuux$IUx+1-& z-i+;EhU>@bgY^;m6m0vl9-F@G(SNExsz0H>um8iKH5joRo|mDL!N=e*v@!HCOft+c z%rPuBgc)KDiH1#v9fmIqmkd7{o*JGRHO4B&w~Vcgos8X$y^RBnlZ}DKIAfY|xp9qg zqjA6Sua53?)6~tUQOSms8jfa=y|aLRbp2} ztqIw!=;Th7!F_0oI){#noUgjC4d2~V?p(PlEUMEnn6jour9?zU$3%tO$uL(Jjv+*R zWIR@Ej)Ki_0_IIcr6*&RV5HLc-QmX%-`S^Vavg(LznAmj-)Zq$9v{tw_Z=tZ9}F1x zoElFzZ0D7!*MSPE+-}Ihcd*)Z4W|8xb#XjU7S~~3iw!OM_iCaz-eF!a8Zz$3*EcWj znJ{{r{l{avbH07QQmj78#CniAwpV(8kJ+`;uq-jF@ZG5gyBz=F9)07KUrt|YWty0-&!vZI@Y*-zad=~+i&>m_N1>{_mNNTs(G_Nm>D>Ap`*>X z?(G#1t7-GfRUdw6{d&Y_EqaWYFkr6z`V8IX%$!wQeYWN-m^C|a!DNT2vvMJ7e$1lS z#Z_XLMz4rk)r?)JTu zb#1_$*?s}j{ex37!yUsWVF}{|)=rla9*wofBch@rqmsgtXzlUe10=N^9_nwigK2A1 zHz#ISNeoJxnKmy^IaK+fp8W$;;%n-W%T!>bhG*xzOP@{cXAE!cIIQ22xN7Nol}U%lGkY zV*@c9={8~J`W@Iv0n27%6NOoG#ydRQNqZGfQ@Pc7*|xu^8NV=?Hm+K>b*uIK&;za8 z3>npR%Cec8{IHlhXYd`(Y*<3uFRzbeg54zZ{h9gF8Y=9#ML9lPQidtVd)3pkjf$_O z8uMlKeuiAycd*m|CI>LSdIaOE8>Xh12{Mt%SZuqTo%i}8H;Z!}_o6w)lXd6iL1g#c zwP=v)&tWQDO)LNRCsRzht)D4gLKGATA`&9Q5~F>>!Xv_>62lTh97iB;SeTR?MxvR_ zC8-XRyeq$`j$W=KXX|bkEw3$CG!(s2l&$l$46>Of+xm^$@FQ)7P(0F5a8Sp37-p{C z9JJf#6WS4h*7y#O36HWyrbMM-4Q0_Z73EFl!KPh1wtTXC>c+`Qj?{g*`&KNUu)gwu zNh7+pv-ZoKzSnL_w)Mf(VXdic@I%#@(WF$T>6T6r!_f8(ZzGv=7<5xILt|f@b zY97-lU^0(67v|NiZO&N~%&2G8zfinzN<*;VQB#NKJY)bY5V59)2~!~-(A52D%G+{{ z$I3xWZfW!w%hC^G8y^?>=#@G}11;z%p-O-61Ro z)`)dgVjLzVdci|xHkB%*b!{X*AI$_KXygDb)?=at;#{l4(b8}Z(>quj(PVj3?>9rY za?1EjEHT9Au(Vm#XUBVvL9MYR$*Rpd{||SE?)OotJsJ;Rj^YX|L-vzp$Q4+I?5E`@ zXkkXkQ%t1Sohy`I-f*wL*Ejq`2*gs+g#-Lds$PIA1x%Br()A_saxluSVfKe{@G<6P zqMXcaZChnCS$iFvc+rk68YUN*y4sGK|88*t}cxM6Hs+=4AZK4GqR@m44W{2=v;@18G6}FhxU!U;DeRa^Gp|3$JtCn zZK7!at>3-Dslh6*zEX8pNczubKYw`ky$ki`&x;HRz&mVve_`VOFI~pH^IgWhm@ulx zf|pnTqnhdI=bJytT^}5@(r)S#oFJL}gBONl(fV{rYbv)4#IWahTm+9vHBFwR*RfJ%P4xJm; z5#sBJU%;K!iua@TV-m4W2G(t77Yj@lteNM}dg~vq?=@oZ^!{izGscbl(1y0BKSld; zc2fKkKUgqjze&-@KV;V*V#cP{G{&~eX5zx`K#2t1Sjzz`s<&jD z-jz(mn9TD_$%MwBBbvCWa6om_)mvAY>8iNuHmh<+`@od&U_Gn<;HeR@!kRYwO}UtJ z7n2XndTd|dngFQ9BKMg0q-&zb6trj9t7b7#k9$36Cx}|{SXDn5Mg=DQM%D@Ia?MgY z=}ecDJ#Ep3O(KkKv@9RpjOH%p7MdRAUcQBy7ADvU!}`~Bm2J2xLTjg8PphdXu~|y} zyIv+Ji7+@41P@$?v5L7yun9V__#*8k4%l2605}wzLW;szEa;3?!*Pn>j6(s#vEaCf zwbii*IJSq}19${`FpF3&9jka_hh;3cjs1JErZ#r9Ee0$Rff;+RR{%7NcEH!gT7Y%1 zbFYY9)Vl)q5c>nZBaQ@oPsD$*kt9|;$1doz0q0?tb5TshI_X+$DY;6}3Rrs^@dZXK zIW1Dy(z^x=wqL|o4g6!Vb?%?iN|z)&(IRA*ZhZy`p3}z8n;}$1I2YRruTPh%LejwgeX9yNgUHWT?1@)Z zz+R#pkBB_1Bvf<0X|Nx6WudzBO^cnns|YomZ*JI%(<;<-zUh!2A8gC1V$ll~g?|XO zoo@!g3uW|%^UVkypIw01ga6MRJDoa&y3RLAupm|Sgg3{}nmbFBIIO^-H;4b=uo{PN zaQGI7O*w4EVFwPoO`SMrhS-P0K^%_aZ~}+ZIGo2}AcqkgCUBU+Vb1iibEb;xIo!%& zE{7j;c#y;69G>LxEQgmkyvAYP^r_RQiVrw^#Nlro${ao;sBz;^;;;gT-W>jeLzDwA z`~MBn;^rD)`oF%5sLK?y{{>PFruzTiK^=Di`U#NZ>s;XG=(evS9u<;G|&zm+Ll-)gMYOO?XazEFJX}Io-j>VAVgr_gA^f4 z$PqST&w|6)V&O72Pq-^Q!j99lnQR5oF4n-m>y|v?@DKd8e#sv~gOXp%J!yqEN))HN z>f;f7+(gdREjb{(S#npXk5(pfA0pnd^uM^Fg763lyk|>JAU0=9&Wbyo@44LdEO*Tn_rO()@44cxlBakB z9=rv?_hoSx;h}FFhGXl15Xvc^FrO6oLfMz>MULZ8?|_=hbGVNb`x_{omiY2W(3M;) zc~r8oKlqe;Cz_l^p#*%G-zv8+JKfmHV7tiztA0;PnT`Ad%9QuzBl!Egp zdFXn2`5iIA;e_0;Gd|q?V*>IM_C+R{{B1`iUDEaDgQVAO}XU6tI*w< ztJphQJy7SI@o~BQ-JN_=_`mz^axazs^-pbtR>EFTZ3hBE4H(^S{{!Of0-(P+& zm(v0$O1Y!_mojJGs_vqVJuFLYxv#wTqTO9lOWWBRcy5pjLYKBES7}mc)IYS^GCa>c zN#xU2(j^=5{G3mo*Psq?#}+blIRDM-5a@vFTT;K3LaF2;e=e=_rC*#693#b<*T@&Y z{_}Uj?MmtMWlC88dX&WQmiq_t;Sp%rL!?;8^NY7qq~KMaTdua?Og~{R{YwroP(Bfk z9PXRv1MmeQUm6S2^YvDZ6~1zsfp8R-Qd?R+YAj!ThY#Lj5Dqn{ zwa1W76kBdp`dunioH!);>~G$ZIv)JkR5YM8S{`l*6D?bd=>VXcYPp z)NE?k&QtYM20;l+xo{qu+Kscdx_qg02Qet)$y}dG?=RMR>UF6tsU@U(E5qw7H`Iqx z1pnqk8ICfXs8^J_yXY~gpX7C}JUaS{n1Cvj3q$lAJcr94?-k1Nl7C;DTy)44vJ5Bw zfpT!VJGl*BZfdQic5wyoRCa2+AQyV#p8gki6EG@(=2_(i-gQEqDk@JAGI4iSiE5RNks9 z)&BpKrZ`(l`2;w5!BQv6_x}`cY2bhIz+3Hq7~g+_uJjYHQ>C@J)cJpS;Q6bO&QZVQ zecbyr#{1Y_5&Y0|v4^ij(3l*Q$3x_qM%qmND|M@MoJ;(u#)DG=_58OF@KrZU)}Wpf z-J(9@Uyk5;p1#mKK405j{5d#3&OelQ$G=Ek@Haiw-?anadEw8cI3*YN<#K^v$|<$} zhU59gkS_~y5&26Y?t*K%g4}p6_g$FPyDN?~LZYJtyJPbEzr!iR57Lf4TMhFUNd4MN zj(-xL{~!cU;jh9AAzb)Gw)c>hG zwZ>S1^JH$7?Fi@T%pa;H#9yLJ${%W6;qIhM<-Z{$_0zonelaAkap=2LoURnBp*amw zzY#T}9uk+fMY_s$j9?x_!s&E#|iw; z`_SlrUhNO_RdV_jk(^7st6fcW6#Jl1T;xFP;@lWwC zlooo8hsH}&S!37K(A3p5)HKty(R9-E(DcJKNW82Wq4CvB(oECLLAYNu{+b|71gA4fW6lpbd*BTM09nW1munFlNSa7{YcU}T0 z1+7(ERa;B@Ci3@y#uqvEvTGW0vE0Q=&Q*FSLF^ve0yRVw-y#UT=LmP+R@vwvV*N|t}%vbn@yEo*p4tKv!P@Cn}1z(-*h-eWm z5md>U_a&{k-w3#A(E<&EJ2aZjq1k8&tzK);)wa-0v==&HEZ<4!3@t@hp_|ZM=ppok zzM{9#N9Zf`6Z%8@IUjlpKj=FHuvzjVXgb#myP)Mf3O(m>XgRM6*Ra9u4dEtqr?-VX zYyy23J1u`N+!r1Q525>HLLt|EmWZOL6?LLPbcg=)74cPUh-(%tVkNPP=p))hhxoc! zU92hAhAy<8SRWRLO`#8MDYh2ditWXYVrQ`%G^4%5K4L#?qdQO>Bn}aWi6g{O;uz5v z8qx{aT6ePefjCW^A~#hmdm$q{?Bsm#e8f0ALraZ&o@!P zCdb&!*oeC20ZsTYVYo0-7$uB`PHQao)1H9+xF=zg?8(@3`vYMr^jy;sVkUIuf!OXl zNC*}}peql9t~>(y8YM&vF+wc#VDZ?xJW)u(F5fB8hpiU2Vk7U}(4l_@?fDPFAJCfr zDHI9ML^L1KP1K7Xq9^oYUgB%ekyRC|i8aJp;+tY4@oll0*g@T`UHRp<=igi5<~Jr0yR=Gu$gd7(WGg%RgZuxfQ{5 z-jZf>D}s64iXezv5k#Qv)Dlv-6+sraB3Q?*2zGHRf&<)&;B#(8@Flk*_=;N*d`odA zy8xuhjbhF(4dPu5rv`aY1Mmx+B3i~tKx!N4yimH7T8ZoH+~Hpby}kjb7gB42tf~dq zpSDE$G)P@5_-u_+3!2jge`vZP6>4FIQ)N&(@XdUrv^0c8eE9VX+h`i0MA{}I0;nlA@CIA z)WWW(1f`DyP%C1ObWl4Tpg}YU5~!X#ph+}Ar}_$d8Z9W`tAG{7ihyR(3}_K8f({h1 z5?~edNjgwQ)FV(w8+6RCi?0J>e`>&*Voku>Vr{@WVjaMGVm(0Y1T7dqI~xKv78?UL z6`Kl1)QRSxcrC@2fUU*WfNjOLfbGTh2-Q*S2-sQd4A@QV2G~RFf!OvEdja+l`vCS6 z`vDFR2LKL4&*}jRJP2@zI0SH*I81m2)OZBoDD>#BfGUpx^c8&tPt?3|fD^y|q`kpt@47&1pXg;JO1 z&bCRs+4Bc!-d`uX861u9Tz0(aeDo@H;^UsuHJvv`4z=Xo9rU zLH>wB(9sYlg%SDX$~VeMI`#Z?{hJ4P4pc{6)l1^{M#xPq(pmlzd9D&q)V$oKzL)n$ z&s0z75RqSH7rndOsB|>=N;XX7`lj=n%a7}>x|225o6p6@^+y$>>WgZrdQ}A7qPpT$ zdQoijpre1i%-qd@I#K?j+D;eMc2|vmdHxZlABc)wFoHA40nXJpMQ{jPfpZ5= z4{!>*;h${o4B!|(!}A%O6~HN);+uet#72PNKR_`%h#k8BG!^Ln=#z@!+dWkXM zZ>YX%@aCdjNF7x!)IE}a{PTmfA*2r>3Rwvhu@b0I4LrYrR#!(LUdbKQ@pba#JglIT zMCWLfMu&PQ`k)^4uDVf6Kre~Dne5Kr3m(%Yu8czP{O+Cq`kk03i+Q8+5`lnK6SInRHQ?c~bgU7D)6*2Kd zU8f$1;^c#`|G-%pHJmQ>P}8pZQ(Y?Yeu(mruCjwLs3|LR`|DFp#8tgK_?@UO^<3qz zvRtG(;kqbipZ7;$)Ozybf2b_f@}RpLr~kEZce%R0yY6M-)pVDSjqAD04?R)Oq4pm1 zCZe=m7rhI-q^PvYU(`q0P@~YI%UzViYA#c4e+}^!Q3^x~i0>!vRf`&Az*`5LBIhx+ zoX2$I+@*%|l{(H>YB*ifbBbmVQgP}zpGY(08lvSB&n0qhNXxk)E$4=`oEy?|Zpe*u zLvEZKa^tO9&s(*Dw`v1#)dt?G4V=@_a88G)HCZOw(ORnFG@#{GLtLrPbwi7+foG~^ zuVBRT4(jVboJNdXW}|)X#p!_&%t7Edgj35$GH#r+*J0HACDK6ry$++_Q+PgyQ-kr% zdH7UE!;s*C!=j!-%}1gJW&8kM{*Ml_zZ6PahFVj~>HxjdrAJyVhza$?YJAFmUlEjw zdNU(($cSfe{8jT`4A% zCOTdJF7xkt@<3eGt0KQstSHvyFM-GN`M9cX&-+tTtMb(@{OXfcp#S2b2R9{p})$2917^*A8@u?U2vb^-F%-uDp6XmZm%0ac=i^sbX zu+@S;cf_4)8S(sj9wVxe-S9;Azf>YR#DwBP+_*|rBu-T{oT}*fm{rSZiyNmcIzDD4 zDFJu_E@ScF{FVoov6#Sbfe!%BH3?XW>+;}Smx*&-Mkl{ToR)!0>{PzWgVU&2IOk;I zJd-=;nLHqi`V_GuIiAS*Cl5}?bdWY&h0ArEBIl({kUad3XRHYeScp@ET;@;25Nn#? znfNMq(TI5s9-<^dLc}>I56EPift%?hb^`1!b_XPm$HZx)#A&0%X`{qB9wVoa5~q+F zP9Zg%LTa3R4~+%2PC7{=Lamcp(zsCTq?t52)Rv>1I!-xte2l2)V?;gYhfF9ZvR<#k zONnGNR6ZnAP)o+mSu!L?aC7Em`P?G8fZKEV^w%8XdGnIgsOeBspvGN|HH~TAczmfP z5N9NbU34kW&CgK#SDNQQtzDg;@iuy_-jJ}Uvo!kgSsD}gERBVHmPQJnrLmFE(m2Rx zX}yosc8s(+GO2&e^Dskx6INUDee! zcjGNce7YdlR9Dv=js}QdSJZ9Q)isx+AtXZG&{wIht~nizAR+3GzDsp=&FyFmiBS&$ z5`P{C*Bp-~kRkPiWxeX^n(NUNGVNZ%U}4DEvD4;h^c;F}=*^*>!&)4^#bGlJ+i}>9 z!+snNnJ{DKbj^DlPT=qZ4rg(=fWtrz!#IrLFp0wq4wp@uGj_aYHHTX{+{58v4o`A; zfx{adKH%^Phkp{(x=ow%{#dOihp%yH<*+J;wK#l}!^Rx8;IJKsT{!GDZRYrC+5sF6 z;cyg(<2anm;S3Jvak!AfkQwu*&(TJ4n80BghuIvi5TxFidOm{G9}_oC zP^Di)p-8hrka&^*4bljUxc~nint0g%7J3VBL88?TG-#kOLKp}6#vDkI!yv0j6P5{U z(Yx*fcm0KM7X0!p#1!!qzfki@{Eg?4M%XMIa6TP}FYZUkbKV~~@1#wnH2&ng)9gWd zcYXif`F{6bey4KL0Ke<+e?q>&O9t``HGUsE-}gJ;&mz8}h(C(I@P88LN-p>pTqzc+ z3&~HQsfX(g?gse?{Y$(go`u^br<(@pcSE249{Td}_`1K`n<#!Pd{Zm(iefT+sa1W*OW?jTwyxL`Z){$UDlr_`)UbIhTHL z2`P0E!Bq(Hv(fk$xr38xtO!1W;5ZJsW(d7LVI2kj%ooxq`bu+PNnZH|WIq$| zxAMBLn%oD?027hcJ;-5tT7#HVd1$~z4CVK(;9?2aC|s2=Vr`B;cg43chz&G}uKxkY jcI43x { - const link = document.createElement("link"); - link.rel = "preload"; - link.as = "font"; - link.href = `https://solidity-docs-dev.readthedocs.io/en/latest/_static/fonts/${filename}`; - link.crossOrigin = ""; - document.head.appendChild(link); - }); - // Rearrange DOM elements for styling rearrangeDom(); diff --git a/docs/conf.py b/docs/conf.py index 550fbf4b36af..ddc3ee81bbdc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -169,7 +169,7 @@ def setup(sphinx): # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. -html_extra_path = ["_static/css", "_static/fonts"] +html_extra_path = ["_static/css"] # List of templates of static files to be included in the HTML output. # Keys represent paths to input files and values are dicts containing: From db5baebff889a09214b47d6f5b534f4c8c24aef0 Mon Sep 17 00:00:00 2001 From: Pawel Gebal Date: Fri, 21 Jul 2023 18:02:06 +0200 Subject: [PATCH 014/150] SMTChecker fix: Do not unroll loop after it completes --- Changelog.md | 1 + libsolidity/formal/BMC.cpp | 14 +++++----- .../loops/do_while_bmc_iterations_6.sol | 26 +++++++++++++++++++ .../do_while_bmc_iterations_semantics_2.sol | 5 ++-- .../do_while_bmc_iterations_semantics_3.sol | 2 +- .../do_while_bmc_iterations_semantics_4.sol | 20 ++++++++++++++ .../loops/for_loop_bmc_iterations_9.sol | 26 +++++++++++++++++++ .../loops/while_bmc_iterations_6.sol | 26 +++++++++++++++++++ 8 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_6.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_4.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_9.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_6.sol diff --git a/Changelog.md b/Changelog.md index 38a8aae41218..7a08269778e9 100644 --- a/Changelog.md +++ b/Changelog.md @@ -8,6 +8,7 @@ Compiler Features: Bugfixes: * NatSpec: Fix internal error when requesting userdoc or devdoc for a contract that emits an event defined in a foreign contract or interface. + * SMTChecker: Fix encoding error that causes loops to unroll after completion. ### 0.8.21 (2023-07-19) diff --git a/libsolidity/formal/BMC.cpp b/libsolidity/formal/BMC.cpp index cead3a528f57..dcaffbdb619b 100644 --- a/libsolidity/formal/BMC.cpp +++ b/libsolidity/formal/BMC.cpp @@ -328,13 +328,13 @@ bool BMC::visit(WhileStatement const& _node) indicesBefore, copyVariableIndices() ); - loopCondition = expr(_node.condition()); + loopCondition = loopCondition && expr(_node.condition()); broke = broke || brokeInCurrentIteration; m_loopCheckpoints.pop(); } } else { - smtutil::Expression loopConditionOnPreviousIteration(true); + smtutil::Expression loopConditionOnPreviousIterations(true); for (unsigned int i = 0; i < bmcLoopIterations; ++i) { m_loopCheckpoints.emplace(); @@ -361,13 +361,13 @@ bool BMC::visit(WhileStatement const& _node) // breaks in current iterations are handled when traversing loop checkpoints // handles case when the loop condition no longer holds but bmc loop iterations still unrolls the loop mergeVariables( - broke || !loopConditionOnPreviousIteration, + broke || !loopConditionOnPreviousIterations, indicesBefore, copyVariableIndices() ); m_loopCheckpoints.pop(); broke = broke || brokeInCurrentIteration; - loopConditionOnPreviousIteration = loopCondition; + loopConditionOnPreviousIterations = loopConditionOnPreviousIterations && loopCondition; } } if (bmcLoopIterations > 0) @@ -384,7 +384,7 @@ bool BMC::visit(ForStatement const& _node) smtutil::Expression broke(false); smtutil::Expression forCondition(true); - smtutil::Expression forConditionOnPreviousIteration(true); + smtutil::Expression forConditionOnPreviousIterations(true); unsigned int bmcLoopIterations = m_settings.bmcLoopIterations.value_or(1); for (unsigned int i = 0; i < bmcLoopIterations; ++i) { @@ -427,13 +427,13 @@ bool BMC::visit(ForStatement const& _node) // breaks in current iterations are handled when traversing loop checkpoints // handles case when the loop condition no longer holds but bmc loop iterations still unrolls the loop mergeVariables( - broke || !forConditionOnPreviousIteration, + broke || !forConditionOnPreviousIterations, indicesBefore, copyVariableIndices() ); m_loopCheckpoints.pop(); broke = broke || brokeInCurrentIteration; - forConditionOnPreviousIteration = forCondition; + forConditionOnPreviousIterations = forConditionOnPreviousIterations && forCondition; } if (bmcLoopIterations > 0) m_context.addAssertion(not(forCondition) || broke); diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_6.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_6.sol new file mode 100644 index 000000000000..8f7c82ad9f71 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_6.sol @@ -0,0 +1,26 @@ +contract C +{ + uint x; + uint y; + + function condition() private returns(bool) { + x = (x + 1) % 2; + return (x == 1); + } + + function f() public { + require(x == 0); + require(y == 0); + do { + ++y; + } while (condition()); + assert(y == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Warning 2661: (85-90): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol index b98bba18a0cb..f1e296a00ab5 100644 --- a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol @@ -9,7 +9,7 @@ contract C { } while (x < 3 || y == 1); // BMC loop iteration setting is just enough to leave the loop assert(x == 3); // should hold - assert(y == 1); // should hold + assert(y == 1); // should fail, when x == 3 loop is completed } } // ==== @@ -17,4 +17,5 @@ contract C { // SMTSolvers: z3 // BMCLoopIterations: 4 // ---- -// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. +// Warning 4661: (244-258): BMC: Assertion violation happens here. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol index 2a5866e162cf..70edda38b6a2 100644 --- a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol @@ -9,7 +9,7 @@ contract C { } while (x < 3 || y == 1); // BMC loop iteration setting is more than enough to leave the loop assert(x == 3); // should hold - assert(y == 1); // should hold + assert(y == 0); // should hold } } // ==== diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_4.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_4.sol new file mode 100644 index 000000000000..bf814ab760b9 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_4.sol @@ -0,0 +1,20 @@ +contract C { + function f() public pure { + uint x = 0; + int y = 0; + do { + ++x; + if (x >= 3) + y = 1; + } while (x < 3 || y == 1); + // BMC loop iteration setting is more than enough to leave the loop + assert(x == 3); // should hold + assert(y == 1); // should hold + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_9.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_9.sol new file mode 100644 index 000000000000..a460106802a7 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_9.sol @@ -0,0 +1,26 @@ +contract C +{ + uint x; + uint y; + + function condition() private returns(bool) { + x = (x + 1) % 2; + return (x == 1); + } + + function f() public { + require(x == 0); + require(y == 0); + for (; condition();) { + ++y; + } + assert(y == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Warning 2661: (85-90): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_6.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_6.sol new file mode 100644 index 000000000000..ffdeeba1a461 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_6.sol @@ -0,0 +1,26 @@ +contract C +{ + uint x; + uint y; + + function condition() private returns(bool) { + x = (x + 1) % 2; + return (x == 1); + } + + function f() public { + require(x == 0); + require(y == 0); + while (condition()) { + ++y; + } + assert(y == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Warning 2661: (85-90): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. From 451232985b01653bb75c04080b57807946fd2ec8 Mon Sep 17 00:00:00 2001 From: franzihei <41991517+franzihei@users.noreply.github.com> Date: Thu, 27 Jul 2023 15:04:07 +0200 Subject: [PATCH 015/150] re-upload original solidity logo to brand guide (#14451) --- docs/brand-guide.rst | 2 +- docs/solidity_logo.svg | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 docs/solidity_logo.svg diff --git a/docs/brand-guide.rst b/docs/brand-guide.rst index 5601b16a8e39..cf471c5e3c5c 100644 --- a/docs/brand-guide.rst +++ b/docs/brand-guide.rst @@ -67,7 +67,7 @@ When using the Solidity logo, please respect the Solidity logo guidelines. Solidity Logo Guidelines ======================== -.. image:: logo.svg +.. image:: solidity_logo.svg :width: 256 *(Right click on the logo to download it.)* diff --git a/docs/solidity_logo.svg b/docs/solidity_logo.svg new file mode 100644 index 000000000000..86b9f4995b24 --- /dev/null +++ b/docs/solidity_logo.svg @@ -0,0 +1,27 @@ + + + + +Vector 1 +Created with Sketch. + + + + + + + + + + + + + From ea7ee3d5fe824261a7c72a491736d4688ab58409 Mon Sep 17 00:00:00 2001 From: r0qs Date: Thu, 27 Jul 2023 18:41:52 +0200 Subject: [PATCH 016/150] Fix yul ast ID to 0 instead of 1. --- Changelog.md | 1 + libsolidity/interface/StandardCompiler.cpp | 2 +- test/cmdlineTests/standard_yul/output.json | 2 +- test/cmdlineTests/standard_yul_object/output.json | 2 +- test/cmdlineTests/standard_yul_object_name/output.json | 2 +- test/cmdlineTests/standard_yul_optimiserSteps/output.json | 2 +- test/cmdlineTests/standard_yul_optimized/output.json | 2 +- 7 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Changelog.md b/Changelog.md index 7a08269778e9..377b5f9ceaff 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,6 +7,7 @@ Compiler Features: Bugfixes: + * AST: Fix wrong initial ID for Yul nodes in the AST. * NatSpec: Fix internal error when requesting userdoc or devdoc for a contract that emits an event defined in a foreign contract or interface. * SMTChecker: Fix encoding error that causes loops to unroll after completion. diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index fc1de4249858..767792601bd5 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -1553,7 +1553,7 @@ Json::Value StandardCompiler::compileYul(InputsAndSettings _inputsAndSettings) if (isArtifactRequested(_inputsAndSettings.outputSelection, sourceName, contractName, "ast", wildcardMatchesExperimental)) { Json::Value sourceResult = Json::objectValue; - sourceResult["id"] = 1; + sourceResult["id"] = 0; sourceResult["ast"] = stack.astJson(); output["sources"][sourceName] = sourceResult; } diff --git a/test/cmdlineTests/standard_yul/output.json b/test/cmdlineTests/standard_yul/output.json index 9dcf201139f4..c1b22726fb84 100644 --- a/test/cmdlineTests/standard_yul/output.json +++ b/test/cmdlineTests/standard_yul/output.json @@ -169,7 +169,7 @@ "nodeType": "YulObject", "subObjects": [] }, - "id": 1 + "id": 0 } } } diff --git a/test/cmdlineTests/standard_yul_object/output.json b/test/cmdlineTests/standard_yul_object/output.json index edf139dc0de2..1404cd3aa7df 100644 --- a/test/cmdlineTests/standard_yul_object/output.json +++ b/test/cmdlineTests/standard_yul_object/output.json @@ -179,7 +179,7 @@ data_4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 616263 } ] }, - "id": 1 + "id": 0 } } } diff --git a/test/cmdlineTests/standard_yul_object_name/output.json b/test/cmdlineTests/standard_yul_object_name/output.json index 7faeed3c3223..6803c322d194 100644 --- a/test/cmdlineTests/standard_yul_object_name/output.json +++ b/test/cmdlineTests/standard_yul_object_name/output.json @@ -258,7 +258,7 @@ sub_0: assembly { } ] }, - "id": 1 + "id": 0 } } } diff --git a/test/cmdlineTests/standard_yul_optimiserSteps/output.json b/test/cmdlineTests/standard_yul_optimiserSteps/output.json index 54dd24ac6814..85a34261f02b 100644 --- a/test/cmdlineTests/standard_yul_optimiserSteps/output.json +++ b/test/cmdlineTests/standard_yul_optimiserSteps/output.json @@ -166,7 +166,7 @@ "nodeType": "YulObject", "subObjects": [] }, - "id": 1 + "id": 0 } } } diff --git a/test/cmdlineTests/standard_yul_optimized/output.json b/test/cmdlineTests/standard_yul_optimized/output.json index b260f72edc66..d580ef6ae01f 100644 --- a/test/cmdlineTests/standard_yul_optimized/output.json +++ b/test/cmdlineTests/standard_yul_optimized/output.json @@ -161,7 +161,7 @@ "nodeType": "YulObject", "subObjects": [] }, - "id": 1 + "id": 0 } } } From ead0615ca30374a3048d47c5b25d6883f740ffd5 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 2 Aug 2023 03:41:18 -0700 Subject: [PATCH 017/150] add site_url root path to images [Fixes #14435] (#14462) --- docs/_static/js/constants.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/docs/_static/js/constants.js b/docs/_static/js/constants.js index abdeb4464fc3..67fa16cdb039 100644 --- a/docs/_static/js/constants.js +++ b/docs/_static/js/constants.js @@ -1,11 +1,18 @@ +// Site URL +const SITE_URL = "https://docs.soliditylang.org" +const { origin, pathname } = location; +const pathSplit = pathname.split("/"); +const rootPath = origin.includes(SITE_URL) && pathSplit.length > 3 ? pathSplit.splice(1, 2).join("/") : '' +const ROOT_URL = `${origin}/${rootPath}`; + // Color mode constants const [DARK, LIGHT] = ["dark", "light"]; -const LIGHT_LOGO_PATH = "_static/img/logo.svg"; -const DARK_LOGO_PATH = "_static/img/logo-dark.svg"; -const SUN_ICON_PATH = "_static/img/sun.svg"; -const MOON_ICON_PATH = "_static/img/moon.svg"; -const LIGHT_HAMBURGER_PATH = "_static/img/hamburger-light.svg"; -const DARK_HAMBURGER_PATH = "_static/img/hamburger-dark.svg"; +const LIGHT_LOGO_PATH = `${ROOT_URL}/_static/img/logo.svg`; +const DARK_LOGO_PATH = `${ROOT_URL}/_static/img/logo-dark.svg`; +const SUN_ICON_PATH = `${ROOT_URL}/_static/img/sun.svg`; +const MOON_ICON_PATH = `${ROOT_URL}/_static/img/moon.svg`; +const LIGHT_HAMBURGER_PATH = `${ROOT_URL}/_static/img/hamburger-light.svg`; +const DARK_HAMBURGER_PATH = `${ROOT_URL}/_static/img/hamburger-dark.svg`; const COLOR_TOGGLE_ICON_CLASS = "color-toggle-icon"; const SOLIDITY_LOGO_CLASS = "solidity-logo"; const LS_COLOR_SCHEME = "color-scheme"; From 6574c10f2589d868ab7e2846d990807ebd2fd0e7 Mon Sep 17 00:00:00 2001 From: Pawel Gebal Date: Thu, 27 Jul 2023 18:16:35 +0200 Subject: [PATCH 018/150] SMTChecker: Visit the condition in for and while loops after loop is unrolled --- Changelog.md | 1 + libsolidity/formal/BMC.cpp | 47 +++++++++++++++---- libsolidity/formal/BMC.h | 2 +- .../loops/do_while_bmc_iterations_7.sol | 19 ++++++++ .../do_while_bmc_iterations_semantics_1.sol | 2 +- .../do_while_bmc_iterations_semantics_2.sol | 9 ++-- .../do_while_bmc_iterations_semantics_3.sol | 8 ++-- .../do_while_bmc_iterations_semantics_4.sol | 4 +- .../loops/for_loop_bmc_iterations_10.sol | 19 ++++++++ .../for_loop_bmc_iterations_semantics_1.sol | 6 +-- .../for_loop_bmc_iterations_semantics_2.sol | 10 ++-- .../for_loop_bmc_iterations_semantics_3.sol | 10 ++-- .../loops/while_bmc_iterations_8.sol | 18 +++++++ .../while_bmc_iterations_semantics_1.sol | 8 ++-- .../while_bmc_iterations_semantics_2.sol | 11 +++-- .../while_bmc_iterations_semantics_3.sol | 10 ++-- .../out_of_bounds/array_2d_4.sol | 2 +- 17 files changed, 142 insertions(+), 44 deletions(-) create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_7.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_10.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_8.sol diff --git a/Changelog.md b/Changelog.md index 377b5f9ceaff..4f74b2dea5de 100644 --- a/Changelog.md +++ b/Changelog.md @@ -10,6 +10,7 @@ Bugfixes: * AST: Fix wrong initial ID for Yul nodes in the AST. * NatSpec: Fix internal error when requesting userdoc or devdoc for a contract that emits an event defined in a foreign contract or interface. * SMTChecker: Fix encoding error that causes loops to unroll after completion. + * SMTChecker: Fix inconsistency on constant condition checks when ``while`` or ``for`` loops are unrolled before the condition check. ### 0.8.21 (2023-07-19) diff --git a/libsolidity/formal/BMC.cpp b/libsolidity/formal/BMC.cpp index dcaffbdb619b..220f6411a5ca 100644 --- a/libsolidity/formal/BMC.cpp +++ b/libsolidity/formal/BMC.cpp @@ -313,7 +313,7 @@ bool BMC::visit(WhileStatement const& _node) auto indicesBefore = copyVariableIndices(); _node.body().accept(*this); - auto [continues, brokeInCurrentIteration] = mergeVariablesFromLoopCheckpoints(); + auto brokeInCurrentIteration = mergeVariablesFromLoopCheckpoints(); auto indicesBreak = copyVariableIndices(); _node.condition().accept(*this); @@ -332,6 +332,8 @@ bool BMC::visit(WhileStatement const& _node) broke = broke || brokeInCurrentIteration; m_loopCheckpoints.pop(); } + if (bmcLoopIterations > 0) + m_context.addAssertion(!loopCondition || broke); } else { smtutil::Expression loopConditionOnPreviousIterations(true); @@ -348,7 +350,7 @@ bool BMC::visit(WhileStatement const& _node) _node.body().accept(*this); popPathCondition(); - auto [continues, brokeInCurrentIteration] = mergeVariablesFromLoopCheckpoints(); + auto brokeInCurrentIteration = mergeVariablesFromLoopCheckpoints(); // merges indices modified when accepting loop condition that no longer holds mergeVariables( @@ -369,9 +371,21 @@ bool BMC::visit(WhileStatement const& _node) broke = broke || brokeInCurrentIteration; loopConditionOnPreviousIterations = loopConditionOnPreviousIterations && loopCondition; } + if (bmcLoopIterations > 0) + { + //after loop iterations are done, we check the loop condition last final time + auto indices = copyVariableIndices(); + _node.condition().accept(*this); + loopCondition = expr(_node.condition()); + // asseert that the loop is complete + m_context.addAssertion(!loopCondition || broke || !loopConditionOnPreviousIterations); + mergeVariables( + broke || !loopConditionOnPreviousIterations, + indices, + copyVariableIndices() + ); + } } - if (bmcLoopIterations > 0) - m_context.addAssertion(not(loopCondition) || broke); m_loopExecutionHappened = true; return false; } @@ -401,7 +415,7 @@ bool BMC::visit(ForStatement const& _node) pushPathCondition(forCondition); _node.body().accept(*this); - auto [continues, brokeInCurrentIteration] = mergeVariablesFromLoopCheckpoints(); + auto brokeInCurrentIteration = mergeVariablesFromLoopCheckpoints(); // accept loop expression if there was no break if (_node.loopExpression()) @@ -436,12 +450,29 @@ bool BMC::visit(ForStatement const& _node) forConditionOnPreviousIterations = forConditionOnPreviousIterations && forCondition; } if (bmcLoopIterations > 0) - m_context.addAssertion(not(forCondition) || broke); + { + //after loop iterations are done, we check the loop condition last final time + auto indices = copyVariableIndices(); + if (_node.condition()) + { + _node.condition()->accept(*this); + forCondition = expr(*_node.condition()); + } + // asseert that the loop is complete + m_context.addAssertion(!forCondition || broke || !forConditionOnPreviousIterations); + mergeVariables( + broke || !forConditionOnPreviousIterations, + indices, + copyVariableIndices() + ); + } m_loopExecutionHappened = true; return false; } -std::tuple BMC::mergeVariablesFromLoopCheckpoints() +// merges variables based on loop control statements +// returns expression indicating whether there was a break in current loop unroll iteration +smtutil::Expression BMC::mergeVariablesFromLoopCheckpoints() { smtutil::Expression continues(false); smtutil::Expression brokeInCurrentIteration(false); @@ -461,7 +492,7 @@ std::tuple BMC::mergeVariablesFromLoop else if (loopControl.kind == LoopControlKind::Continue) continues = continues || loopControl.pathConditions; } - return std::pair(continues, brokeInCurrentIteration); + return brokeInCurrentIteration; } bool BMC::visit(TryStatement const& _tryStatement) diff --git a/libsolidity/formal/BMC.h b/libsolidity/formal/BMC.h index 3abaac1bd2d3..dfd4169e2998 100644 --- a/libsolidity/formal/BMC.h +++ b/libsolidity/formal/BMC.h @@ -190,7 +190,7 @@ class BMC: public SMTEncoder smtutil::CheckResult checkSatisfiable(); //@} - std::tuple mergeVariablesFromLoopCheckpoints(); + smtutil::Expression mergeVariablesFromLoopCheckpoints(); bool isInsideLoop() const; std::unique_ptr m_interface; diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_7.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_7.sol new file mode 100644 index 000000000000..81d94e1b9c33 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_7.sol @@ -0,0 +1,19 @@ +contract C +{ + uint256[] y; + + function f() public view { + uint256 x = 0; + do { + ++x; + } while (x < y.length); + require(x != 0); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 1 +// ---- +// Warning 6838: (124-130): BMC: Condition is always true. +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_1.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_1.sol index 6656817809b5..4d1112ac0605 100644 --- a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_1.sol +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_1.sol @@ -7,7 +7,7 @@ contract C { y = 1; ++x; } while (x < 3 || y == 1); - // BMC loop iteration setting is not enough to leave the loop + // BMC loop iteration setting is not enough to leave the loop assert(x == 0); // should hold - no assumptions on value if didn't complete loop assert(y == 0); // should hold - no assumptions on value if didn't complete loop } diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol index f1e296a00ab5..9db49261c01e 100644 --- a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol @@ -7,9 +7,10 @@ contract C { y = 1; ++x; } while (x < 3 || y == 1); - // BMC loop iteration setting is just enough to leave the loop - assert(x == 3); // should hold + // BMC loop iteration setting is just enough to leave the loop + assert(x == 3); assert(y == 1); // should fail, when x == 3 loop is completed + assert(y == 0); } } // ==== @@ -17,5 +18,5 @@ contract C { // SMTSolvers: z3 // BMCLoopIterations: 4 // ---- -// Warning 4661: (244-258): BMC: Assertion violation happens here. -// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. +// Warning 4661: (223-237): BMC: Assertion violation happens here. +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol index 70edda38b6a2..e5e03d3d6289 100644 --- a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol @@ -7,9 +7,10 @@ contract C { y = 1; ++x; } while (x < 3 || y == 1); - // BMC loop iteration setting is more than enough to leave the loop - assert(x == 3); // should hold - assert(y == 0); // should hold + // BMC loop iteration setting is more than enough to leave the loop + assert(x == 3); + assert(y == 1); // should fail + assert(y == 0); } } // ==== @@ -17,4 +18,5 @@ contract C { // SMTSolvers: z3 // BMCLoopIterations: 5 // ---- +// Warning 4661: (228-242): BMC: Assertion violation happens here. // Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_4.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_4.sol index bf814ab760b9..04d197045db9 100644 --- a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_4.sol +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_4.sol @@ -3,11 +3,11 @@ contract C { uint x = 0; int y = 0; do { - ++x; + ++x; if (x >= 3) y = 1; } while (x < 3 || y == 1); - // BMC loop iteration setting is more than enough to leave the loop + // BMC loop iteration setting is more than enough to leave the loop assert(x == 3); // should hold assert(y == 1); // should hold } diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_10.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_10.sol new file mode 100644 index 000000000000..5c91d2ce5c93 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_10.sol @@ -0,0 +1,19 @@ +contract C +{ + uint256[] y; + + function f() public view { + uint256 x = 0; + for (uint i = 0; i < y.length; i++) { + x = 1; + } + // tests that constant condition warning is not reported + require(x != 0); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 1 +// ---- +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_1.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_1.sol index 915c0e6908ee..d3a6c825fc82 100644 --- a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_1.sol +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_1.sol @@ -7,13 +7,13 @@ contract C { y = 1; } // BMC loop iteration setting is not enough to leave the loop - assert(x == 0); // should hold - no assumptions on value if didn't complete loop - assert(y == 0); // should hold - no assumptions on value if didn't complete loop + assert(x == 0); // should hold - no assumptions on value if didn't complete the loop + assert(y == 0); // should hold - no assumptions on value if didn't complete the loop } } // ==== // SMTEngine: bmc // SMTSolvers: z3 -// BMCLoopIterations: 3 +// BMCLoopIterations: 2 // ---- // Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_2.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_2.sol index 337515c9a03c..720f621dfd8b 100644 --- a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_2.sol +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_2.sol @@ -6,14 +6,16 @@ contract C { if (x >= 3) y = 1; } - // BMC loop iteration setting is just enough to leave the loop - assert(x == 3); // should hold - no assumptions on value if didn't complete loop - assert(y == 0); // should hold - no assumptions on value if didn't complete loop + // BMC loop iteration setting is just enough to leave the loop + assert(x == 3); + assert(y == 1); // should fail + assert(y == 0); } } // ==== // SMTEngine: bmc // SMTSolvers: z3 -// BMCLoopIterations: 4 +// BMCLoopIterations: 3 // ---- +// Warning 4661: (216-230): BMC: Assertion violation happens here. // Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_3.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_3.sol index 5ff9d17782a8..00cd3a5ce8da 100644 --- a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_3.sol +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_3.sol @@ -6,14 +6,16 @@ contract C { if (x >= 3) y = 1; } - // BMC loop iteration setting is more than enough to leave the loop - assert(x == 3); // should hold - no assumptions on value if didn't complete loop - assert(y == 0); // should hold - no assumptions on value if didn't complete loop + // BMC loop iteration setting is more than enough to leave the loop + assert(x == 3); + assert(y == 1); // should fail + assert(y == 0); } } // ==== // SMTEngine: bmc // SMTSolvers: z3 -// BMCLoopIterations: 5 +// BMCLoopIterations: 4 // ---- +// Warning 4661: (221-235): BMC: Assertion violation happens here. // Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_8.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_8.sol new file mode 100644 index 000000000000..b7ad4e2ecb0b --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_8.sol @@ -0,0 +1,18 @@ +contract C +{ + uint256[] y; + + function f() public view { + uint256 x = 0; + while (x < y.length) { + x = 1; + } + // tests that constant condition warning is not reported + require(x != 0); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 1 +// ---- diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_1.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_1.sol index eb497be7cb81..7de8b8146a30 100644 --- a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_1.sol +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_1.sol @@ -7,14 +7,14 @@ contract C { y = 1; ++x; } - // BMC loop iteration setting is not enough to leave the loop - assert(x == 3); - assert(y == 1); + // BMC loop iteration setting is not enough to leave the loop + assert(x == 0); // should hold - no assumptions on value if didn't complete the loop + assert(y == 0); // should hold - no assumptions on value if didn't complete the loop } } // ==== // SMTEngine: bmc // SMTSolvers: z3 -// BMCLoopIterations: 3 +// BMCLoopIterations: 2 // ---- // Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_2.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_2.sol index 90682c7f77ec..a50acf4d2b4e 100644 --- a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_2.sol +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_2.sol @@ -7,15 +7,16 @@ contract C { y = 1; ++x; } - // BMC loop iteration setting is just enough to leave the loop - assert(x == 3); // should hold + // BMC loop iteration setting is just enough to leave the loop + assert(x == 3); assert(y == 1); // should fail + assert(y == 0); } } // ==== // SMTEngine: bmc // SMTSolvers: z3 -// BMCLoopIterations: 4 +// BMCLoopIterations: 3 // ---- -// Warning 4661: (240-254): BMC: Assertion violation happens here. -// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. +// Warning 4661: (220-234): BMC: Assertion violation happens here. +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_3.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_3.sol index 992ac7f802f8..6ead58142c35 100644 --- a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_3.sol +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_3.sol @@ -7,14 +7,16 @@ contract C { y = 1; ++x; } - // BMC loop iteration setting is more than enough to leave the loop - assert(x == 3); // should hold - assert(y == 0); // should hold + // BMC loop iteration setting is more than enough to leave the loop + assert(x == 3); + assert(y == 1); // should fail + assert(y == 0); } } // ==== // SMTEngine: bmc // SMTSolvers: z3 -// BMCLoopIterations: 5 +// BMCLoopIterations: 4 // ---- +// Warning 4661: (224-238): BMC: Assertion violation happens here. // Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/out_of_bounds/array_2d_4.sol b/test/libsolidity/smtCheckerTests/out_of_bounds/array_2d_4.sol index ee7ab8bcc739..2a9f39d1a2fa 100644 --- a/test/libsolidity/smtCheckerTests/out_of_bounds/array_2d_4.sol +++ b/test/libsolidity/smtCheckerTests/out_of_bounds/array_2d_4.sol @@ -24,4 +24,4 @@ contract C { // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. // Warning 2661: (184-197): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. // Warning 2661: (228-244): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. -// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. From aecb11eff4a7c7a1cbbfbd956a95ae5c685d6f45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 4 Aug 2023 17:42:22 +0200 Subject: [PATCH 019/150] Make better use of virtual functions to customize CommonSyntaxTest in test cases based on it --- test/libsolidity/SMTCheckerTest.cpp | 9 +++------ test/libsolidity/SMTCheckerTest.h | 3 +-- test/libsolidity/SyntaxTest.cpp | 13 ++++--------- test/libsolidity/SyntaxTest.h | 4 +--- 4 files changed, 9 insertions(+), 20 deletions(-) diff --git a/test/libsolidity/SMTCheckerTest.cpp b/test/libsolidity/SMTCheckerTest.cpp index dddee7da43a6..366f0f9f47db 100644 --- a/test/libsolidity/SMTCheckerTest.cpp +++ b/test/libsolidity/SMTCheckerTest.cpp @@ -127,14 +127,11 @@ SMTCheckerTest::SMTCheckerTest(string const& _filename): SyntaxTest(_filename, E m_modelCheckerSettings.bmcLoopIterations = std::optional{bmcLoopIterations}; } -TestCase::TestResult SMTCheckerTest::run(ostream& _stream, string const& _linePrefix, bool _formatted) +void SMTCheckerTest::setupCompiler() { - setupCompiler(); - compiler().setModelCheckerSettings(m_modelCheckerSettings); - parseAndAnalyze(); - filterObtainedErrors(); + SyntaxTest::setupCompiler(); - return conclude(_stream, _linePrefix, _formatted); + compiler().setModelCheckerSettings(m_modelCheckerSettings); } void SMTCheckerTest::filterObtainedErrors() diff --git a/test/libsolidity/SMTCheckerTest.h b/test/libsolidity/SMTCheckerTest.h index 459a6c5656a6..3e8d8238bb3c 100644 --- a/test/libsolidity/SMTCheckerTest.h +++ b/test/libsolidity/SMTCheckerTest.h @@ -38,8 +38,7 @@ class SMTCheckerTest: public SyntaxTest } SMTCheckerTest(std::string const& _filename); - TestResult run(std::ostream& _stream, std::string const& _linePrefix = "", bool _formatted = false) override; - + void setupCompiler() override; void filterObtainedErrors() override; void printUpdatedExpectations(std::ostream& _stream, std::string const& _linePrefix) const override; diff --git a/test/libsolidity/SyntaxTest.cpp b/test/libsolidity/SyntaxTest.cpp index 159f9dcb12a0..8efea5720334 100644 --- a/test/libsolidity/SyntaxTest.cpp +++ b/test/libsolidity/SyntaxTest.cpp @@ -43,15 +43,6 @@ SyntaxTest::SyntaxTest(string const& _filename, langutil::EVMVersion _evmVersion m_parserErrorRecovery = _parserErrorRecovery; } -TestCase::TestResult SyntaxTest::run(ostream& _stream, string const& _linePrefix, bool _formatted) -{ - setupCompiler(); - parseAndAnalyze(); - filterObtainedErrors(); - - return conclude(_stream, _linePrefix, _formatted); -} - string SyntaxTest::addPreamble(string const& _sourceCode) { // Silence compiler version warning @@ -83,6 +74,8 @@ void SyntaxTest::setupCompiler() void SyntaxTest::parseAndAnalyze() { + setupCompiler(); + if (compiler().parse() && compiler().analyze()) try { @@ -112,6 +105,8 @@ void SyntaxTest::parseAndAnalyze() -1 }); } + + filterObtainedErrors(); } void SyntaxTest::filterObtainedErrors() diff --git a/test/libsolidity/SyntaxTest.h b/test/libsolidity/SyntaxTest.h index 597fa0e1b2b6..4f47f101245f 100644 --- a/test/libsolidity/SyntaxTest.h +++ b/test/libsolidity/SyntaxTest.h @@ -47,13 +47,11 @@ class SyntaxTest: public AnalysisFramework, public solidity::test::CommonSyntaxT } SyntaxTest(std::string const& _filename, langutil::EVMVersion _evmVersion, bool _parserErrorRecovery = false); - TestResult run(std::ostream& _stream, std::string const& _linePrefix = "", bool _formatted = false) override; - protected: /// Returns @param _sourceCode prefixed with the version pragma and the SPDX license identifier. static std::string addPreamble(std::string const& _sourceCode); - void setupCompiler(); + virtual void setupCompiler(); void parseAndAnalyze() override; virtual void filterObtainedErrors(); From f87bef24311e8a10a8fad4718f184d28bde0876e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 4 Aug 2023 16:25:33 +0200 Subject: [PATCH 020/150] AnalysisFramework: Make it possible to customize CompilerStack creation --- test/libsolidity/AnalysisFramework.cpp | 5 +++++ test/libsolidity/AnalysisFramework.h | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/test/libsolidity/AnalysisFramework.cpp b/test/libsolidity/AnalysisFramework.cpp index 7bbaaaa5d283..199a03e0b2e0 100644 --- a/test/libsolidity/AnalysisFramework.cpp +++ b/test/libsolidity/AnalysisFramework.cpp @@ -75,6 +75,11 @@ AnalysisFramework::parseAnalyseAndReturnError( return make_pair(&compiler().ast(""), std::move(errors)); } +std::unique_ptr AnalysisFramework::createStack() const +{ + return std::make_unique(); +} + ErrorList AnalysisFramework::filterErrors(ErrorList const& _errorList, bool _includeWarningsAndInfos) const { ErrorList errors; diff --git a/test/libsolidity/AnalysisFramework.h b/test/libsolidity/AnalysisFramework.h index 7dbbb902fff7..cb1162d59cac 100644 --- a/test/libsolidity/AnalysisFramework.h +++ b/test/libsolidity/AnalysisFramework.h @@ -76,7 +76,7 @@ class AnalysisFramework solidity::frontend::CompilerStack& compiler() { if (!m_compiler) - m_compiler = std::make_unique(); + m_compiler = createStack(); return *m_compiler; } @@ -84,10 +84,14 @@ class AnalysisFramework solidity::frontend::CompilerStack const& compiler() const { if (!m_compiler) - m_compiler = std::make_unique(); + m_compiler = createStack(); return *m_compiler; } + /// Creates a new instance of @p CompilerStack. Override if your test case needs to pass in + /// custom constructor arguments. + virtual std::unique_ptr createStack() const; + private: mutable std::unique_ptr m_compiler; }; From e62bc30e9e9b34c1ea6b83736be7c1c01a0a6934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 4 Aug 2023 20:37:21 +0200 Subject: [PATCH 021/150] AnalysisFramework.filterErrors(): Provide default for _includeWarningsAndInfos --- test/libsolidity/AnalysisFramework.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/libsolidity/AnalysisFramework.h b/test/libsolidity/AnalysisFramework.h index 7dbbb902fff7..f2be710256d3 100644 --- a/test/libsolidity/AnalysisFramework.h +++ b/test/libsolidity/AnalysisFramework.h @@ -66,8 +66,8 @@ class AnalysisFramework std::string const& _signature ); - // filter out the warnings in m_warningsToFilter or all warnings and infos if _includeWarningsAndInfos is false - langutil::ErrorList filterErrors(langutil::ErrorList const& _errorList, bool _includeWarningsAndInfos) const; + /// filter out the warnings in m_warningsToFilter or all warnings and infos if _includeWarningsAndInfos is false + langutil::ErrorList filterErrors(langutil::ErrorList const& _errorList, bool _includeWarningsAndInfos = true) const; std::vector m_warningsToFilter = {"This is a pre-release compiler version"}; std::vector m_messagesToCut = {"Source file requires different compiler version (current compiler is"}; From 6f3a3795574c1fafc61620e0e1dbedd019f7a2a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 4 Aug 2023 20:38:15 +0200 Subject: [PATCH 022/150] AnalysisFramework: Add filteredErrors() --- test/libsolidity/AnalysisFramework.cpp | 2 +- test/libsolidity/AnalysisFramework.h | 4 ++++ test/libsolidity/SyntaxTest.cpp | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/test/libsolidity/AnalysisFramework.cpp b/test/libsolidity/AnalysisFramework.cpp index 7bbaaaa5d283..14eb334bd62a 100644 --- a/test/libsolidity/AnalysisFramework.cpp +++ b/test/libsolidity/AnalysisFramework.cpp @@ -68,7 +68,7 @@ AnalysisFramework::parseAnalyseAndReturnError( compiler().analyze(); - ErrorList errors = filterErrors(compiler().errors(), _reportWarnings); + ErrorList errors = filteredErrors(_reportWarnings); if (errors.size() > 1 && !_allowMultipleErrors) BOOST_FAIL("Multiple errors found: " + formatErrors()); diff --git a/test/libsolidity/AnalysisFramework.h b/test/libsolidity/AnalysisFramework.h index f2be710256d3..f26538493361 100644 --- a/test/libsolidity/AnalysisFramework.h +++ b/test/libsolidity/AnalysisFramework.h @@ -68,6 +68,10 @@ class AnalysisFramework /// filter out the warnings in m_warningsToFilter or all warnings and infos if _includeWarningsAndInfos is false langutil::ErrorList filterErrors(langutil::ErrorList const& _errorList, bool _includeWarningsAndInfos = true) const; + langutil::ErrorList filteredErrors(bool _includeWarningsAndInfos = true) const + { + return filterErrors(compiler().errors(), _includeWarningsAndInfos); + } std::vector m_warningsToFilter = {"This is a pre-release compiler version"}; std::vector m_messagesToCut = {"Source file requires different compiler version (current compiler is"}; diff --git a/test/libsolidity/SyntaxTest.cpp b/test/libsolidity/SyntaxTest.cpp index 159f9dcb12a0..e13d1f0dcfb3 100644 --- a/test/libsolidity/SyntaxTest.cpp +++ b/test/libsolidity/SyntaxTest.cpp @@ -116,7 +116,7 @@ void SyntaxTest::parseAndAnalyze() void SyntaxTest::filterObtainedErrors() { - for (auto const& currentError: filterErrors(compiler().errors(), true)) + for (auto const& currentError: filteredErrors()) { int locationStart = -1; int locationEnd = -1; From 6c1bcb9a81d39f6f783513bee2117813b49e5043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 4 Aug 2023 13:32:32 +0200 Subject: [PATCH 023/150] AnalysisFramework.formatErrors(): Support colored output and error IDs --- test/libsolidity/AnalysisFramework.cpp | 21 +++++++++++++++++---- test/libsolidity/AnalysisFramework.h | 11 +++++++++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/test/libsolidity/AnalysisFramework.cpp b/test/libsolidity/AnalysisFramework.cpp index 14eb334bd62a..eacf92c4351c 100644 --- a/test/libsolidity/AnalysisFramework.cpp +++ b/test/libsolidity/AnalysisFramework.cpp @@ -141,17 +141,30 @@ ErrorList AnalysisFramework::expectError(std::string const& _source, bool _warni return sourceAndErrors.second; } -string AnalysisFramework::formatErrors() const +string AnalysisFramework::formatErrors( + bool _colored, + bool _withErrorIds +) const { string message; for (auto const& error: compiler().errors()) - message += formatError(*error); + message += formatError(*error, _colored, _withErrorIds); return message; } -string AnalysisFramework::formatError(Error const& _error) const +string AnalysisFramework::formatError( + Error const& _error, + bool _colored, + bool _withErrorIds +) const { - return SourceReferenceFormatter::formatErrorInformation(_error, *m_compiler); + return SourceReferenceFormatter::formatExceptionInformation( + _error, + _error.type(), + *m_compiler, + _colored, + _withErrorIds + ); } ContractDefinition const* AnalysisFramework::retrieveContractByName(SourceUnit const& _source, string const& _name) diff --git a/test/libsolidity/AnalysisFramework.h b/test/libsolidity/AnalysisFramework.h index f26538493361..dc855688c5e1 100644 --- a/test/libsolidity/AnalysisFramework.h +++ b/test/libsolidity/AnalysisFramework.h @@ -57,8 +57,15 @@ class AnalysisFramework bool success(std::string const& _source); langutil::ErrorList expectError(std::string const& _source, bool _warning = false, bool _allowMultiple = false); - std::string formatErrors() const; - std::string formatError(langutil::Error const& _error) const; + std::string formatErrors( + bool _colored = false, + bool _withErrorIds = false + ) const; + std::string formatError( + langutil::Error const& _error, + bool _colored = false, + bool _withErrorIds = false + ) const; static ContractDefinition const* retrieveContractByName(SourceUnit const& _source, std::string const& _name); static FunctionTypePointer retrieveFunctionBySignature( From e42242cd6f704fe95400354679ea60865db0cc1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 4 Aug 2023 20:39:37 +0200 Subject: [PATCH 024/150] AnalysisFramework.formatErrors(): Require providing errors explicitly --- test/libsolidity/AnalysisFramework.cpp | 9 +++++---- test/libsolidity/AnalysisFramework.h | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/test/libsolidity/AnalysisFramework.cpp b/test/libsolidity/AnalysisFramework.cpp index eacf92c4351c..cbcedfba6abe 100644 --- a/test/libsolidity/AnalysisFramework.cpp +++ b/test/libsolidity/AnalysisFramework.cpp @@ -63,14 +63,14 @@ AnalysisFramework::parseAnalyseAndReturnError( _allowMultipleErrors = _allowMultipleErrors || _allowRecoveryErrors; if (!compiler().parse()) { - BOOST_FAIL("Parsing contract failed in analysis test suite:" + formatErrors()); + BOOST_FAIL("Parsing contract failed in analysis test suite:" + formatErrors(compiler().errors())); } compiler().analyze(); ErrorList errors = filteredErrors(_reportWarnings); if (errors.size() > 1 && !_allowMultipleErrors) - BOOST_FAIL("Multiple errors found: " + formatErrors()); + BOOST_FAIL("Multiple errors found: " + formatErrors(compiler().errors())); return make_pair(&compiler().ast(""), std::move(errors)); } @@ -123,7 +123,7 @@ SourceUnit const* AnalysisFramework::parseAndAnalyse(string const& _source) BOOST_REQUIRE(!!sourceAndError.first); string message; if (!sourceAndError.second.empty()) - message = "Unexpected error: " + formatErrors(); + message = "Unexpected error: " + formatErrors(compiler().errors()); BOOST_REQUIRE_MESSAGE(sourceAndError.second.empty(), message); return sourceAndError.first; } @@ -142,12 +142,13 @@ ErrorList AnalysisFramework::expectError(std::string const& _source, bool _warni } string AnalysisFramework::formatErrors( + langutil::ErrorList _errors, bool _colored, bool _withErrorIds ) const { string message; - for (auto const& error: compiler().errors()) + for (auto const& error: _errors) message += formatError(*error, _colored, _withErrorIds); return message; } diff --git a/test/libsolidity/AnalysisFramework.h b/test/libsolidity/AnalysisFramework.h index dc855688c5e1..6eaa00790f4e 100644 --- a/test/libsolidity/AnalysisFramework.h +++ b/test/libsolidity/AnalysisFramework.h @@ -58,6 +58,7 @@ class AnalysisFramework langutil::ErrorList expectError(std::string const& _source, bool _warning = false, bool _allowMultiple = false); std::string formatErrors( + langutil::ErrorList _errors, bool _colored = false, bool _withErrorIds = false ) const; @@ -158,7 +159,7 @@ do \ auto sourceAndError = parseAnalyseAndReturnError((text), true); \ std::string message; \ if (!sourceAndError.second.empty()) \ - message = formatErrors();\ + message = formatErrors(compiler().errors());\ BOOST_CHECK_MESSAGE(sourceAndError.second.empty(), message); \ } \ while(0) From 6d8b1374c50c568fc710f34bccdd73544d539f4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 4 Aug 2023 15:27:27 +0200 Subject: [PATCH 025/150] Use AnalysisFramework's error formatting and filtering features in more test cases --- test/libsolidity/AnalysisFramework.cpp | 2 +- test/libsolidity/GasTest.cpp | 3 +-- test/libsolidity/MemoryGuardTest.cpp | 3 +++ test/libsolidity/SolidityCompiler.cpp | 5 ++++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/test/libsolidity/AnalysisFramework.cpp b/test/libsolidity/AnalysisFramework.cpp index cbcedfba6abe..47643deea8a1 100644 --- a/test/libsolidity/AnalysisFramework.cpp +++ b/test/libsolidity/AnalysisFramework.cpp @@ -70,7 +70,7 @@ AnalysisFramework::parseAnalyseAndReturnError( ErrorList errors = filteredErrors(_reportWarnings); if (errors.size() > 1 && !_allowMultipleErrors) - BOOST_FAIL("Multiple errors found: " + formatErrors(compiler().errors())); + BOOST_FAIL("Multiple errors found: " + formatErrors(errors)); return make_pair(&compiler().ast(""), std::move(errors)); } diff --git a/test/libsolidity/GasTest.cpp b/test/libsolidity/GasTest.cpp index 030472e8a1c6..78a0ca907f65 100644 --- a/test/libsolidity/GasTest.cpp +++ b/test/libsolidity/GasTest.cpp @@ -118,8 +118,7 @@ TestCase::TestResult GasTest::run(ostream& _stream, string const& _linePrefix, b if (!compiler().parseAndAnalyze() || !compiler().compile()) { - SourceReferenceFormatter{_stream, compiler(), _formatted, false} - .printErrorInformation(compiler().errors()); + _stream << formatErrors(filteredErrors(), _formatted); return TestResult::FatalError; } diff --git a/test/libsolidity/MemoryGuardTest.cpp b/test/libsolidity/MemoryGuardTest.cpp index b757e673fe4c..06d6723f088c 100644 --- a/test/libsolidity/MemoryGuardTest.cpp +++ b/test/libsolidity/MemoryGuardTest.cpp @@ -44,7 +44,10 @@ TestCase::TestResult MemoryGuardTest::run(ostream& _stream, string const& _lineP compiler().setViaIR(true); compiler().setOptimiserSettings(OptimiserSettings::none()); if (!compiler().compile()) + { + _stream << formatErrors(filteredErrors(), _formatted); return TestResult::FatalError; + } m_obtainedResult.clear(); for (string contractName: compiler().contractNames()) diff --git a/test/libsolidity/SolidityCompiler.cpp b/test/libsolidity/SolidityCompiler.cpp index cd99cbf53f34..71c19e596e3d 100644 --- a/test/libsolidity/SolidityCompiler.cpp +++ b/test/libsolidity/SolidityCompiler.cpp @@ -42,7 +42,10 @@ BOOST_AUTO_TEST_CASE(does_not_include_creation_time_only_internal_functions) )"; compiler().setOptimiserSettings(solidity::test::CommonOptions::get().optimize); BOOST_REQUIRE(success(sourceCode)); - BOOST_REQUIRE_MESSAGE(compiler().compile(), "Compiling contract failed"); + BOOST_REQUIRE_MESSAGE( + compiler().compile(), + "Contract compilation failed:\n" + formatErrors(filteredErrors(), true /* _colored */) + ); bytes const& creationBytecode = solidity::test::bytecodeSansMetadata(compiler().object("C").bytecode); bytes const& runtimeBytecode = solidity::test::bytecodeSansMetadata(compiler().runtimeObject("C").bytecode); BOOST_CHECK(creationBytecode.size() >= 90); From 96e7b4f46bc1e2f1827bb9d730b176b28a52568e Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Fri, 4 Aug 2023 12:27:18 +0200 Subject: [PATCH 026/150] Rematerialize zero literals --- Changelog.md | 1 + libyul/optimiser/Metrics.cpp | 4 + .../output | 9 +- .../output | 9 +- .../output | 9 +- .../debug_info_in_yul_snippet_escaping/output | 55 +++-- .../ir_compiler_subobjects/output | 25 +- .../output | 9 +- .../output | 9 +- test/cmdlineTests/name_simplifier/output | 119 +++++----- .../cmdlineTests/optimizer_array_sload/output | 25 +- .../output.json | 220 +++++++----------- .../output.json | 9 +- .../output.json | 9 +- .../output.json | 9 +- .../output.json | 154 ++++++------ .../viair_subobject_optimization/output | 99 ++++---- test/cmdlineTests/viair_subobjects/output | 25 +- test/libsolidity/gasTests/abiv2_optimised.sol | 6 +- .../abiEncoderV1/abi_decode_v2_storage.sol | 4 +- .../abi_encode_calldata_slice.sol | 4 +- .../struct/struct_storage_ptr.sol | 2 +- .../abi_encode_calldata_slice.sol | 4 +- .../abiEncoderV2/abi_encode_v2.sol | 2 +- ...2_in_function_inherited_in_v1_contract.sol | 2 +- .../abiEncoderV2/calldata_array.sol | 2 +- .../calldata_overlapped_dynamic_arrays.sol | 2 +- .../abiEncoderV2/storage_array_encoding.sol | 4 +- .../abi_decode_simple_storage.sol | 4 +- .../array/array_memory_index_access.sol | 2 +- .../array/array_storage_index_access.sol | 18 +- .../array_storage_index_boundary_test.sol | 4 +- .../array/array_storage_index_zeroed_test.sol | 8 +- .../array/array_storage_length_access.sol | 2 +- .../array/array_storage_push_empty.sol | 4 +- ...rray_storage_push_empty_length_address.sol | 4 +- .../array/array_storage_push_pop.sol | 4 +- .../arrays_complex_from_and_to_storage.sol | 2 +- .../array/byte_array_transitional_2.sol | 2 +- .../array/bytes_length_member.sol | 4 +- .../array/constant_var_as_array_length.sol | 2 +- .../copying/array_copy_calldata_storage.sol | 2 +- .../copying/array_copy_cleanup_uint40.sol | 2 +- .../copying/array_copy_clear_storage.sol | 2 +- .../copying/array_copy_different_packing.sol | 2 +- .../copying/array_copy_including_array.sol | 4 +- .../array/copying/array_copy_nested_array.sol | 2 +- ...ay_copy_storage_storage_different_base.sol | 2 +- ..._storage_storage_different_base_nested.sol | 2 +- .../array_copy_storage_storage_dyn_dyn.sol | 2 +- ...y_copy_storage_storage_dynamic_dynamic.sol | 2 +- ...ay_copy_storage_storage_static_dynamic.sol | 2 +- ...ray_copy_storage_storage_static_static.sol | 2 +- .../array_copy_storage_storage_struct.sol | 2 +- .../array_copy_storage_to_memory_nested.sol | 4 +- .../copying/array_copy_target_leftover.sol | 2 +- .../copying/array_copy_target_simple.sol | 2 +- .../copying/array_copy_target_simple_2.sol | 2 +- .../copying/array_elements_to_mapping.sol | 4 +- .../array_nested_calldata_to_storage.sol | 8 +- .../array_nested_memory_to_storage.sol | 4 +- ...on_external_storage_to_storage_dynamic.sol | 2 +- ...o_storage_dynamic_different_mutability.sol | 2 +- .../array_of_struct_calldata_to_storage.sol | 2 +- .../array_of_struct_memory_to_storage.sol | 2 +- ..._containing_arrays_calldata_to_storage.sol | 2 +- ...ts_containing_arrays_memory_to_storage.sol | 2 +- .../array_storage_multi_items_per_slot.sol | 2 +- .../array/copying/array_to_mapping.sol | 4 +- .../array/copying/bytes_inside_mappings.sol | 4 +- .../copying/bytes_storage_to_storage.sol | 14 +- .../calldata_array_dynamic_to_storage.sol | 2 +- .../copying/calldata_array_to_mapping.sol | 2 +- ...nup_during_multi_element_per_slot_copy.sol | 2 +- .../copy_byte_array_in_struct_to_storage.sol | 8 +- .../copying/copy_byte_array_to_storage.sol | 4 +- .../copy_function_internal_storage_array.sol | 2 +- .../array/copying/copy_removes_bytes_data.sol | 4 +- .../copying/copying_bytes_multiassign.sol | 4 +- ...d_array_of_structs_calldata_to_storage.sol | 6 +- ...ted_array_of_structs_memory_to_storage.sol | 6 +- .../function_type_array_to_storage.sol | 2 +- .../memory_dyn_2d_bytes_to_storage.sol | 4 +- ...ested_array_element_storage_to_storage.sol | 6 +- ...d_array_of_structs_calldata_to_storage.sol | 6 +- ...ted_array_of_structs_memory_to_storage.sol | 6 +- ...ed_array_of_structs_storage_to_storage.sol | 4 +- ...amic_array_element_calldata_to_storage.sol | 4 +- .../array/copying/storage_memory_nested.sol | 2 +- .../copying/storage_memory_nested_bytes.sol | 4 +- .../storage_memory_nested_from_pointer.sol | 2 +- .../copying/storage_memory_nested_struct.sol | 2 +- .../copying/storage_memory_packed_dyn.sol | 2 +- .../array/create_memory_array.sol | 2 +- .../array/delete/bytes_delete_element.sol | 4 +- .../array/dynamic_array_cleanup.sol | 2 +- .../array/dynamic_arrays_in_storage.sol | 2 +- .../array/dynamic_multi_array_cleanup.sol | 2 +- .../array/fixed_array_cleanup.sol | 2 +- .../array/fixed_arrays_as_return_type.sol | 2 +- .../array/fixed_arrays_in_constructors.sol | 2 +- .../array/function_array_cross_calls.sol | 2 +- ...nvalid_encoding_for_storage_byte_array.sol | 2 +- .../array/pop/array_pop_array_transition.sol | 2 +- .../array/pop/array_pop_uint16_transition.sol | 2 +- .../array/pop/array_pop_uint24_transition.sol | 2 +- .../pop/byte_array_pop_long_storage_empty.sol | 2 +- ...ray_pop_long_storage_empty_garbage_ref.sol | 2 +- .../array/pop/byte_array_pop_masking_long.sol | 2 +- .../semanticTests/array/push/array_push.sol | 2 +- .../push/array_push_nested_from_calldata.sol | 2 +- .../array/push/array_push_struct.sol | 2 +- .../push/array_push_struct_from_calldata.sol | 2 +- .../array/push/byte_array_push_transition.sol | 2 +- .../array/push/nested_bytes_push.sol | 4 +- .../array/push/push_no_args_2d.sol | 4 +- .../array/push/push_no_args_bytes.sol | 2 +- .../semanticTests/array/reusing_memory.sol | 2 +- .../byte_array_to_storage_cleanup.sol | 4 +- .../copy_from_calldata_removes_bytes_data.sol | 4 +- .../constructor/arrays_in_constructors.sol | 2 +- .../bytes_in_constructors_packer.sol | 4 +- .../bytes_in_constructors_unpacker.sol | 4 +- .../constructor_arguments_external.sol | 2 +- .../constructor_static_array_argument.sol | 2 +- .../constructor/no_callvalue_check.sol | 2 +- .../constructor_inheritance_init_order.sol | 2 +- .../constructor_inheritance_init_order_2.sol | 2 +- .../semanticTests/constructor_with_params.sol | 2 +- ...ructor_with_params_diamond_inheritance.sol | 2 +- .../constructor_with_params_inheritance.sol | 2 +- .../events/event_dynamic_array_storage.sol | 2 +- .../events/event_dynamic_array_storage_v2.sol | 2 +- .../event_dynamic_nested_array_storage_v2.sol | 4 +- .../events/event_indexed_string.sol | 2 +- .../externalContracts/FixedFeeRegistrar.sol | 2 +- .../externalContracts/base64.sol | 6 +- .../externalContracts/deposit_contract.sol | 10 +- .../externalContracts/prbmath_signed.sol | 2 +- .../externalContracts/prbmath_unsigned.sol | 2 +- .../externalContracts/ramanujan_pi.sol | 2 +- .../semanticTests/externalContracts/snark.sol | 4 +- .../externalContracts/strings.sol | 4 +- .../creation_function_call_with_args.sol | 2 +- .../creation_function_call_with_salt.sol | 2 +- .../functionCall/failed_create.sol | 4 +- .../functionCall/gas_and_value_basic.sol | 2 +- .../gas_and_value_brace_syntax.sol | 2 +- .../mapping_array_internal_argument.sol | 2 +- .../immutable/multi_creation.sol | 2 +- .../semanticTests/immutable/use_scratch.sol | 2 +- .../inheritance/value_for_constructor.sol | 2 +- .../balance_other_contract.sol | 2 +- .../libraries/internal_types_in_library.sol | 2 +- .../using_library_mappings_public.sol | 2 +- .../using_library_mappings_return.sol | 2 +- .../salted_create/salted_create.sol | 2 +- .../salted_create_with_value.sol | 2 +- .../semanticTests/smoke/constructor.sol | 2 +- .../semanticTests/state/blockhash_basic.sol | 2 +- .../storage/empty_nonempty_empty.sol | 4 +- .../storage/packed_storage_structs_bytes.sol | 2 +- ...ta_struct_with_nested_array_to_storage.sol | 2 +- .../conversion/recursive_storage_memory.sol | 2 +- .../structs/copy_from_mapping.sol | 4 +- .../copy_struct_array_from_storage.sol | 2 +- .../copy_substructures_from_mapping.sol | 4 +- .../structs/copy_substructures_to_mapping.sol | 12 +- .../semanticTests/structs/copy_to_mapping.sol | 8 +- .../structs/memory_structs_nested_load.sol | 2 +- ...truct_containing_bytes_copy_and_delete.sol | 8 +- .../semanticTests/structs/struct_copy.sol | 4 +- .../structs/struct_copy_via_local.sol | 2 +- .../struct_delete_storage_with_array.sol | 4 +- .../struct_memory_to_storage_function_ptr.sol | 2 +- .../semanticTests/structs/structs.sol | 2 +- .../userDefinedValueType/calldata.sol | 4 +- .../userDefinedValueType/erc20.sol | 2 +- .../semanticTests/various/address_code.sol | 4 +- .../semanticTests/various/create_calldata.sol | 4 +- .../various/destructuring_assignment.sol | 4 +- .../semanticTests/various/erc20.sol | 2 +- .../various/negative_stack_height.sol | 2 +- .../semanticTests/various/senders_balance.sol | 2 +- .../skip_dynamic_types_for_structs.sol | 4 +- .../various/staticcall_for_view_and_pure.sol | 4 +- .../various/swap_in_storage_overwrite.sol | 2 +- .../semanticTests/various/value_complex.sol | 2 +- .../semanticTests/various/value_insane.sol | 2 +- .../viaYul/copy_struct_invalid_ir_bug.sol | 2 +- .../fullSuite/abi_example1.yul | 19 +- .../fullSuite/clear_after_if_continue.yul | 12 +- .../fullSuite/create2_and_mask.yul | 7 +- .../static_array_slot_computation.yul | 15 +- .../unusedFunctionParameterPruner_loop.yul | 11 +- 195 files changed, 661 insertions(+), 740 deletions(-) diff --git a/Changelog.md b/Changelog.md index 4f74b2dea5de..6f220005e138 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,7 @@ Language Features: Compiler Features: + * Yul Optimizer: If ``PUSH0`` is supported, favor zero literals over storing zero values in variables. Bugfixes: diff --git a/libyul/optimiser/Metrics.cpp b/libyul/optimiser/Metrics.cpp index 2eac51595693..a48cbf91b183 100644 --- a/libyul/optimiser/Metrics.cpp +++ b/libyul/optimiser/Metrics.cpp @@ -158,6 +158,10 @@ void CodeCost::operator()(Literal const& _literal) case LiteralKind::Number: for (u256 n = u256(_literal.value.str()); n >= 0x100; n >>= 8) cost++; + if (valueOfLiteral(_literal) == 0) + if (auto evmDialect = dynamic_cast(&m_dialect)) + if (evmDialect->evmVersion().hasPush0()) + --m_cost; break; case LiteralKind::String: cost = _literal.value.str().size(); diff --git a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_all/output b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_all/output index 115bf34cc292..a232fed8fc3b 100644 --- a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_all/output +++ b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_all/output @@ -189,12 +189,11 @@ object "C_6" { /// @src 0:60:101 "contract C {..." if iszero(lt(calldatasize(), 4)) { - let _1 := 0 - if eq(0x26121ff0, shr(224, calldataload(_1))) + if eq(0x26121ff0, shr(224, calldataload(0))) { - if callvalue() { revert(_1, _1) } - if slt(add(calldatasize(), not(3)), _1) { revert(_1, _1) } - return(_1, _1) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + return(0, 0) } } revert(0, 0) diff --git a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_location_only/output b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_location_only/output index 33faf3cf19a6..00a6b290f826 100644 --- a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_location_only/output +++ b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_location_only/output @@ -188,12 +188,11 @@ object "C_6" { /// @src 0:60:101 if iszero(lt(calldatasize(), 4)) { - let _1 := 0 - if eq(0x26121ff0, shr(224, calldataload(_1))) + if eq(0x26121ff0, shr(224, calldataload(0))) { - if callvalue() { revert(_1, _1) } - if slt(add(calldatasize(), not(3)), _1) { revert(_1, _1) } - return(_1, _1) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + return(0, 0) } } revert(0, 0) diff --git a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_none/output b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_none/output index 330715023379..c8715df15051 100644 --- a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_none/output +++ b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_none/output @@ -177,12 +177,11 @@ object "C_6" { { if iszero(lt(calldatasize(), 4)) { - let _1 := 0 - if eq(0x26121ff0, shr(224, calldataload(_1))) + if eq(0x26121ff0, shr(224, calldataload(0))) { - if callvalue() { revert(_1, _1) } - if slt(add(calldatasize(), not(3)), _1) { revert(_1, _1) } - return(_1, _1) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + return(0, 0) } } revert(0, 0) diff --git a/test/cmdlineTests/debug_info_in_yul_snippet_escaping/output b/test/cmdlineTests/debug_info_in_yul_snippet_escaping/output index 9fb9a2dbc6ae..94dfb864262a 100644 --- a/test/cmdlineTests/debug_info_in_yul_snippet_escaping/output +++ b/test/cmdlineTests/debug_info_in_yul_snippet_escaping/output @@ -434,65 +434,64 @@ object "D_27" { mstore(_2, _1) if iszero(lt(calldatasize(), 4)) { - let _3 := 0 - if eq(0x26121ff0, shr(224, calldataload(_3))) + if eq(0x26121ff0, shr(224, calldataload(0))) { - if callvalue() { revert(_3, _3) } - if slt(add(calldatasize(), not(3)), _3) { revert(_3, _3) } + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } /// @src 0:446:491 "new /// @src 0:149:156 \"new C()\"..." - let _4 := datasize("C_2") - let _5 := add(_1, _4) - let _6 := 0xffffffffffffffff - if or(gt(_5, _6), lt(_5, _1)) + let _3 := datasize("C_2") + let _4 := add(_1, _3) + let _5 := 0xffffffffffffffff + if or(gt(_4, _5), lt(_4, _1)) { /// @src 0:279:599 "contract D /** @src 0:96:165 \"contract D {...\" *\/ {..." - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(4, 0x41) - revert(_3, 0x24) + revert(0, 0x24) } /// @src 0:446:491 "new /// @src 0:149:156 \"new C()\"..." - datacopy(_1, dataoffset("C_2"), _4) - if iszero(create(/** @src 0:279:599 "contract D /** @src 0:96:165 \"contract D {...\" *\/ {..." */ _3, /** @src 0:446:491 "new /// @src 0:149:156 \"new C()\"..." */ _1, sub(_5, _1))) + datacopy(_1, dataoffset("C_2"), _3) + if iszero(create(/** @src 0:279:599 "contract D /** @src 0:96:165 \"contract D {...\" *\/ {..." */ 0, /** @src 0:446:491 "new /// @src 0:149:156 \"new C()\"..." */ _1, sub(_4, _1))) { /// @src 0:279:599 "contract D /** @src 0:96:165 \"contract D {...\" *\/ {..." let pos := mload(_2) - returndatacopy(pos, _3, returndatasize()) + returndatacopy(pos, 0, returndatasize()) revert(pos, returndatasize()) } let memPtr := mload(_2) let newFreePtr := add(memPtr, _2) - if or(gt(newFreePtr, /** @src 0:446:491 "new /// @src 0:149:156 \"new C()\"..." */ _6), /** @src 0:279:599 "contract D /** @src 0:96:165 \"contract D {...\" *\/ {..." */ lt(newFreePtr, memPtr)) + if or(gt(newFreePtr, /** @src 0:446:491 "new /// @src 0:149:156 \"new C()\"..." */ _5), /** @src 0:279:599 "contract D /** @src 0:96:165 \"contract D {...\" *\/ {..." */ lt(newFreePtr, memPtr)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(4, 0x41) - revert(_3, 0x24) + revert(0, 0x24) } mstore(_2, newFreePtr) mstore(memPtr, 2) - let _7 := 32 - mstore(add(memPtr, _7), "/*") + let _6 := 32 + mstore(add(memPtr, _6), "/*") let memPtr_1 := mload(_2) let newFreePtr_1 := add(memPtr_1, 96) - if or(gt(newFreePtr_1, /** @src 0:446:491 "new /// @src 0:149:156 \"new C()\"..." */ _6), /** @src 0:279:599 "contract D /** @src 0:96:165 \"contract D {...\" *\/ {..." */ lt(newFreePtr_1, memPtr_1)) + if or(gt(newFreePtr_1, /** @src 0:446:491 "new /// @src 0:149:156 \"new C()\"..." */ _5), /** @src 0:279:599 "contract D /** @src 0:96:165 \"contract D {...\" *\/ {..." */ lt(newFreePtr_1, memPtr_1)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(4, 0x41) - revert(_3, 0x24) + revert(0, 0x24) } mstore(_2, newFreePtr_1) mstore(memPtr_1, 39) - mstore(add(memPtr_1, _7), 0x2f2a2a204073726320303a39363a313635202022636f6e74726163742044207b) + mstore(add(memPtr_1, _6), 0x2f2a2a204073726320303a39363a313635202022636f6e74726163742044207b) mstore(add(memPtr_1, _2), shl(200, 0x2e2e2e22202a2f)) let memPos := mload(_2) - mstore(memPos, _7) + mstore(memPos, _6) let length := mload(memPtr_1) - mstore(add(memPos, _7), length) - let i := _3 - for { } lt(i, length) { i := add(i, _7) } + mstore(add(memPos, _6), length) + let i := 0 + for { } lt(i, length) { i := add(i, _6) } { - mstore(add(add(memPos, i), _2), mload(add(add(memPtr_1, i), _7))) + mstore(add(add(memPos, i), _2), mload(add(add(memPtr_1, i), _6))) } - mstore(add(add(memPos, length), _2), _3) + mstore(add(add(memPos, length), _2), 0) return(memPos, add(sub(add(memPos, and(add(length, 31), not(31))), memPos), _2)) } } diff --git a/test/cmdlineTests/ir_compiler_subobjects/output b/test/cmdlineTests/ir_compiler_subobjects/output index 0a505a4acdac..39ef53f5529b 100644 --- a/test/cmdlineTests/ir_compiler_subobjects/output +++ b/test/cmdlineTests/ir_compiler_subobjects/output @@ -47,31 +47,30 @@ object "D_16" { mstore(64, _1) if iszero(lt(calldatasize(), 4)) { - let _2 := 0 - if eq(0x26121ff0, shr(224, calldataload(_2))) + if eq(0x26121ff0, shr(224, calldataload(0))) { - if callvalue() { revert(_2, _2) } - if slt(add(calldatasize(), not(3)), _2) { revert(_2, _2) } + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } /// @src 0:149:156 "new C()" - let _3 := datasize("C_3") - let _4 := add(_1, _3) - if or(gt(_4, 0xffffffffffffffff), lt(_4, _1)) + let _2 := datasize("C_3") + let _3 := add(_1, _2) + if or(gt(_3, 0xffffffffffffffff), lt(_3, _1)) { /// @src 0:96:165 "contract D {..." - mstore(_2, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(4, 0x41) - revert(_2, 0x24) + revert(0, 0x24) } /// @src 0:149:156 "new C()" - datacopy(_1, dataoffset("C_3"), _3) - if iszero(create(/** @src 0:96:165 "contract D {..." */ _2, /** @src 0:149:156 "new C()" */ _1, sub(_4, _1))) + datacopy(_1, dataoffset("C_3"), _2) + if iszero(create(/** @src 0:96:165 "contract D {..." */ 0, /** @src 0:149:156 "new C()" */ _1, sub(_3, _1))) { /// @src 0:96:165 "contract D {..." let pos := mload(64) - returndatacopy(pos, _2, returndatasize()) + returndatacopy(pos, 0, returndatasize()) revert(pos, returndatasize()) } - return(_2, _2) + return(0, 0) } } revert(0, 0) diff --git a/test/cmdlineTests/ir_with_assembly_no_memoryguard_creation/output b/test/cmdlineTests/ir_with_assembly_no_memoryguard_creation/output index 50915c8dc351..5c822949a409 100644 --- a/test/cmdlineTests/ir_with_assembly_no_memoryguard_creation/output +++ b/test/cmdlineTests/ir_with_assembly_no_memoryguard_creation/output @@ -17,12 +17,11 @@ object "D_12" { /// @src 0:82:175 "contract D {..." if iszero(lt(calldatasize(), 4)) { - let _1 := 0 - if eq(0x26121ff0, shr(224, calldataload(_1))) + if eq(0x26121ff0, shr(224, calldataload(0))) { - if callvalue() { revert(_1, _1) } - if slt(add(calldatasize(), not(3)), _1) { revert(_1, _1) } - return(_1, _1) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + return(0, 0) } } revert(0, 0) diff --git a/test/cmdlineTests/ir_with_assembly_no_memoryguard_runtime/output b/test/cmdlineTests/ir_with_assembly_no_memoryguard_runtime/output index b81febf73d99..f6be1493ec79 100644 --- a/test/cmdlineTests/ir_with_assembly_no_memoryguard_runtime/output +++ b/test/cmdlineTests/ir_with_assembly_no_memoryguard_runtime/output @@ -19,12 +19,11 @@ object "D_8" { /// @src 0:82:166 "contract D {..." if iszero(lt(calldatasize(), 4)) { - let _1 := 0 - if eq(0x26121ff0, shr(224, calldataload(_1))) + if eq(0x26121ff0, shr(224, calldataload(0))) { - if callvalue() { revert(_1, _1) } - if slt(add(calldatasize(), not(3)), _1) { revert(_1, _1) } - return(_1, _1) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + return(0, 0) } } revert(0, 0) diff --git a/test/cmdlineTests/name_simplifier/output b/test/cmdlineTests/name_simplifier/output index 170e58ffb11a..936378bd3387 100644 --- a/test/cmdlineTests/name_simplifier/output +++ b/test/cmdlineTests/name_simplifier/output @@ -21,101 +21,100 @@ object "C_59" { let _2 := 4 if iszero(lt(calldatasize(), _2)) { - let _3 := 0 - if eq(0xf8eddcc6, shr(224, calldataload(_3))) + if eq(0xf8eddcc6, shr(224, calldataload(0))) { - if callvalue() { revert(_3, _3) } - let _4 := 32 - if slt(add(calldatasize(), not(3)), _4) { revert(_3, _3) } + if callvalue() { revert(0, 0) } + let _3 := 32 + if slt(add(calldatasize(), not(3)), _3) { revert(0, 0) } let offset := calldataload(_2) - let _5 := 0xffffffffffffffff - if gt(offset, _5) { revert(_3, _3) } - if iszero(slt(add(offset, 35), calldatasize())) { revert(_3, _3) } - let _6 := calldataload(add(_2, offset)) - let _7 := 36 - if gt(_6, _5) + let _4 := 0xffffffffffffffff + if gt(offset, _4) { revert(0, 0) } + if iszero(slt(add(offset, 35), calldatasize())) { revert(0, 0) } + let _5 := calldataload(add(_2, offset)) + let _6 := 36 + if gt(_5, _4) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(_2, 0x41) - revert(_3, _7) + revert(0, _6) } - let _8 := shl(5, _6) - let _9 := not(31) - let newFreePtr := add(_1, and(add(_8, 63), _9)) - if or(gt(newFreePtr, _5), lt(newFreePtr, _1)) + let _7 := shl(5, _5) + let _8 := not(31) + let newFreePtr := add(_1, and(add(_7, 63), _8)) + if or(gt(newFreePtr, _4), lt(newFreePtr, _1)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(_2, 0x41) - revert(_3, _7) + revert(0, _6) } - let _10 := 64 - mstore(_10, newFreePtr) + let _9 := 64 + mstore(_9, newFreePtr) let dst := _1 - mstore(_1, _6) - dst := add(_1, _4) + mstore(_1, _5) + dst := add(_1, _3) let dst_1 := dst - let srcEnd := add(add(offset, _8), _7) - if gt(srcEnd, calldatasize()) { revert(_3, _3) } - let src := add(offset, _7) - for { } lt(src, srcEnd) { src := add(src, _4) } + let srcEnd := add(add(offset, _7), _6) + if gt(srcEnd, calldatasize()) { revert(0, 0) } + let src := add(offset, _6) + for { } lt(src, srcEnd) { src := add(src, _3) } { - if slt(sub(calldatasize(), src), _4) { revert(_3, _3) } - let memPtr := mload(_10) - let newFreePtr_1 := add(memPtr, _4) - if or(gt(newFreePtr_1, _5), lt(newFreePtr_1, memPtr)) + if slt(sub(calldatasize(), src), _3) { revert(0, 0) } + let memPtr := mload(_9) + let newFreePtr_1 := add(memPtr, _3) + if or(gt(newFreePtr_1, _4), lt(newFreePtr_1, memPtr)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(_2, 0x41) - revert(_3, _7) + revert(0, _6) } - mstore(_10, newFreePtr_1) + mstore(_9, newFreePtr_1) mstore(memPtr, calldataload(src)) mstore(dst, memPtr) - dst := add(dst, _4) + dst := add(dst, _3) } if iszero(mload(_1)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(_2, 0x32) - revert(_3, _7) + revert(0, _6) } - sstore(_3, mload(/** @src 0:469:474 "_s[0]" */ mload(dst_1))) + sstore(0, mload(/** @src 0:469:474 "_s[0]" */ mload(dst_1))) /// @src 0:346:625 "contract C {..." if iszero(lt(/** @src 0:492:493 "1" */ 0x01, /** @src 0:346:625 "contract C {..." */ mload(_1))) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(_2, 0x32) - revert(_3, _7) + revert(0, _6) } - let _11 := mload(/** @src 0:489:494 "_s[1]" */ mload(/** @src 0:346:625 "contract C {..." */ add(_1, _10))) - sstore(0x02, _11) - let memPtr_1 := mload(_10) + let _10 := mload(/** @src 0:489:494 "_s[1]" */ mload(/** @src 0:346:625 "contract C {..." */ add(_1, _9))) + sstore(0x02, _10) + let memPtr_1 := mload(_9) let newFreePtr_2 := add(memPtr_1, 160) - if or(gt(newFreePtr_2, _5), lt(newFreePtr_2, memPtr_1)) + if or(gt(newFreePtr_2, _4), lt(newFreePtr_2, memPtr_1)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(_2, 0x41) - revert(_3, _7) + revert(0, _6) } - mstore(_10, newFreePtr_2) + mstore(_9, newFreePtr_2) mstore(memPtr_1, 100) - mstore(add(memPtr_1, _4), "longstringlongstringlongstringlo") - mstore(add(memPtr_1, _10), "ngstringlongstringlongstringlong") - let _12 := 96 - mstore(add(memPtr_1, _12), "stringlongstringlongstringlongst") + mstore(add(memPtr_1, _3), "longstringlongstringlongstringlo") + mstore(add(memPtr_1, _9), "ngstringlongstringlongstringlong") + let _11 := 96 + mstore(add(memPtr_1, _11), "stringlongstringlongstringlongst") mstore(add(memPtr_1, 128), "ring") - let memPos := mload(_10) - mstore(memPos, _11) - mstore(add(memPos, _4), _10) + let memPos := mload(_9) + mstore(memPos, _10) + mstore(add(memPos, _3), _9) let length := mload(memPtr_1) - mstore(add(memPos, _10), length) - let i := _3 - for { } lt(i, length) { i := add(i, _4) } + mstore(add(memPos, _9), length) + let i := 0 + for { } lt(i, length) { i := add(i, _3) } { - mstore(add(add(memPos, i), _12), mload(add(add(memPtr_1, i), _4))) + mstore(add(add(memPos, i), _11), mload(add(add(memPtr_1, i), _3))) } - mstore(add(add(memPos, length), _12), _3) - return(memPos, add(sub(add(memPos, and(add(length, 31), _9)), memPos), _12)) + mstore(add(add(memPos, length), _11), 0) + return(memPos, add(sub(add(memPos, and(add(length, 31), _8)), memPos), _11)) } } revert(0, 0) diff --git a/test/cmdlineTests/optimizer_array_sload/output b/test/cmdlineTests/optimizer_array_sload/output index 98b23306afbc..f2f95f15d173 100644 --- a/test/cmdlineTests/optimizer_array_sload/output +++ b/test/cmdlineTests/optimizer_array_sload/output @@ -21,26 +21,25 @@ object "Arraysum_34" { let _1 := 4 if iszero(lt(calldatasize(), _1)) { - let _2 := 0 - if eq(0x81d73423, shr(224, calldataload(_2))) + if eq(0x81d73423, shr(224, calldataload(0))) { - if callvalue() { revert(_2, _2) } - if slt(add(calldatasize(), not(3)), _2) { revert(_2, _2) } - let var_sum := _2 + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + let var_sum := 0 /// @src 0:368:378 "uint i = 0" - let var_i := /** @src 0:80:429 "contract Arraysum {..." */ _2 - let _3 := sload(_2) + let var_i := /** @src 0:80:429 "contract Arraysum {..." */ var_sum + let _2 := sload(var_sum) /// @src 0:364:423 "for(uint i = 0; i < values.length; i++)..." for { } - /** @src 0:380:397 "i < values.length" */ lt(var_i, _3) + /** @src 0:380:397 "i < values.length" */ lt(var_i, _2) /// @src 0:368:378 "uint i = 0" { /// @src 0:80:429 "contract Arraysum {..." if eq(var_i, not(0)) { - mstore(_2, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(_1, 0x11) - revert(_2, 0x24) + revert(0, 0x24) } /// @src 0:399:402 "i++" var_i := /** @src 0:80:429 "contract Arraysum {..." */ add(var_i, 1) @@ -48,13 +47,13 @@ object "Arraysum_34" { /// @src 0:399:402 "i++" { /// @src 0:80:429 "contract Arraysum {..." - mstore(_2, _2) + mstore(0, 0) let sum := add(var_sum, sload(add(18569430475105882587588266137607568536673111973893317399460219858819262702947, var_i))) if gt(var_sum, sum) { - mstore(_2, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(_1, 0x11) - revert(_2, 0x24) + revert(0, 0x24) } /// @src 0:407:423 "sum += values[i]" var_sum := sum diff --git a/test/cmdlineTests/standard_debug_info_in_evm_asm_via_ir_location/output.json b/test/cmdlineTests/standard_debug_info_in_evm_asm_via_ir_location/output.json index 28a76eb95612..339df2093e07 100644 --- a/test/cmdlineTests/standard_debug_info_in_evm_asm_via_ir_location/output.json +++ b/test/cmdlineTests/standard_debug_info_in_evm_asm_via_ir_location/output.json @@ -82,20 +82,16 @@ sub_0: assembly { /* \"C\":79:428 contract C... */ 0x80 0x40 - dup2 - dup2 + swap1 + dup1 + dup3 mstore jumpi(tag_2, iszero(lt(calldatasize, 0x04))) 0x00 dup1 revert tag_2: - 0x00 - swap2 - dup3 - calldataload - 0xe0 - shr + shr(0xe0, calldataload(0x00)) swap1 dup2 0x26121ff0 @@ -117,13 +113,8 @@ sub_0: assembly { revert tag_8: jumpi(tag_12, callvalue) - dup2 - add(calldatasize, not(0x03)) - slt - tag_12 - jumpi - dup2 - sload + jumpi(tag_12, slt(add(not(0x03), calldatasize), 0x00)) + sload(0x00) sub(shl(0xff, 0x01), 0x01) dup2 eq @@ -131,11 +122,11 @@ sub_0: assembly { jumpi 0x01 add - swap2 - dup3 + swap1 dup2 + 0x00 sstore - dup2 + dup1 mload shl(0xe4, 0x026121ff) /* \"C\":403:411 this.f() */ @@ -152,37 +143,40 @@ sub_0: assembly { /* \"C\":403:411 this.f() */ gas staticcall - swap2 - dup3 + swap1 + dup2 iszero tag_16 jumpi - dup1 - swap3 + /* \"C\":79:428 contract C... */ + 0x00 + /* \"C\":403:411 this.f() */ + swap2 tag_18 jumpi /* \"C\":79:428 contract C... */ tag_19: - /* \"C\":403:411 this.f() */ - 0x20 /* \"C\":392:411 stateVar + this.f() */ - dup5 - /* \"C\":392:422 stateVar + this.f() + immutVar */ + pop tag_20 - /* \"C\":392:411 stateVar + this.f() */ + /* \"C\":392:422 stateVar + this.f() + immutVar */ tag_21 - dup7 - dup10 + /* \"C\":392:411 stateVar + this.f() */ + swap2 + /* \"C\":403:411 this.f() */ + 0x20 + /* \"C\":392:411 stateVar + this.f() */ + swap5 tag_1 jump\t// in - tag_21: + tag_20: /* \"C\":414:422 immutVar */ immutable(\"0xe4b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10\") /* \"C\":392:422 stateVar + this.f() + immutVar */ swap1 tag_1 jump\t// in - tag_20: + tag_21: /* \"C\":79:428 contract C... */ swap1 mload @@ -193,8 +187,6 @@ sub_0: assembly { /* \"C\":403:411 this.f() */ tag_18: swap1 - swap2 - pop 0x20 returndatasize dup2 @@ -238,9 +230,8 @@ sub_0: assembly { pop mload /* \"C\":392:411 stateVar + this.f() */ - tag_21 + tag_20 /* \"C\":403:411 this.f() */ - 0x20 jump(tag_19) /* \"C\":79:428 contract C... */ tag_26: @@ -263,20 +254,21 @@ sub_0: assembly { jump(tag_23) tag_16: /* \"C\":79:428 contract C... */ - dup4 + dup3 mload - swap1 returndatasize - swap1 + 0x00 dup3 returndatacopy returndatasize swap1 revert tag_14: + /* \"C\":117:119 41 */ shl(0xe0, 0x4e487b71) + /* \"C\":79:428 contract C... */ + 0x00 /* \"C\":117:119 41 */ - dup4 mstore 0x11 /* \"C\":79:428 contract C... */ @@ -284,24 +276,22 @@ sub_0: assembly { /* \"C\":117:119 41 */ mstore 0x24 - dup4 + /* \"C\":79:428 contract C... */ + 0x00 + /* \"C\":117:119 41 */ revert /* \"C\":79:428 contract C... */ tag_12: - pop + 0x00 dup1 revert tag_6: pop jumpi(tag_12, callvalue) - dup2 - add(calldatasize, not(0x03)) - slt - tag_12 - jumpi + jumpi(tag_12, slt(add(not(0x03), calldatasize), 0x00)) 0x20 - swap2 - sload + swap1 + sload(0x00) swap1 mload swap1 @@ -309,22 +299,17 @@ sub_0: assembly { mstore return tag_4: - dup4 - swap1 jumpi(tag_12, callvalue) - dup2 - add(calldatasize, not(0x03)) - slt - tag_12 - jumpi + jumpi(tag_12, slt(add(not(0x03), calldatasize), 0x00)) /* \"C\":290:298 immutVar */ immutable(\"0xe4b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10\") /* \"C\":117:119 41 */ - dup1 - 0x29 - add swap1 dup2 + 0x29 + add + swap2 + dup3 slt 0x01 and @@ -332,8 +317,7 @@ sub_0: assembly { jumpi /* \"C\":79:428 contract C... */ 0x20 - swap3 - pop + swap2 dup2 mstore return @@ -360,13 +344,9 @@ sub_0: assembly { iszero and or - tag_38 + tag_14 jumpi jump\t// out - tag_38: - mstore(0x00, shl(0xe0, 0x4e487b71)) - mstore(0x04, 0x11) - revert(0x00, 0x24) auxdata: } @@ -471,20 +451,16 @@ sub_0: assembly { /* \"D\":91:166 contract D is C(3)... */ 0x80 0x40 - dup2 - dup2 + swap1 + dup1 + dup3 mstore jumpi(tag_2, iszero(lt(calldatasize, 0x04))) 0x00 dup1 revert tag_2: - 0x00 - swap2 - dup3 - calldataload - 0xe0 - shr + shr(0xe0, calldataload(0x00)) swap1 dup2 0x26121ff0 @@ -506,13 +482,8 @@ sub_0: assembly { revert tag_8: jumpi(tag_12, callvalue) - dup2 - add(calldatasize, not(0x03)) - slt - tag_12 - jumpi - dup2 - sload + jumpi(tag_12, slt(add(not(0x03), calldatasize), 0x00)) + sload(0x00) sub(shl(0xff, 0x01), 0x01) dup2 eq @@ -520,11 +491,11 @@ sub_0: assembly { jumpi 0x01 add - swap2 - dup3 + swap1 dup2 + 0x00 sstore - dup2 + dup1 mload shl(0xe4, 0x026121ff) /* \"C\":403:411 this.f() */ @@ -541,37 +512,40 @@ sub_0: assembly { /* \"C\":403:411 this.f() */ gas staticcall - swap2 - dup3 + swap1 + dup2 iszero tag_16 jumpi - dup1 - swap3 + /* \"D\":91:166 contract D is C(3)... */ + 0x00 + /* \"C\":403:411 this.f() */ + swap2 tag_18 jumpi /* \"D\":91:166 contract D is C(3)... */ tag_19: - /* \"C\":403:411 this.f() */ - 0x20 /* \"C\":392:411 stateVar + this.f() */ - dup5 - /* \"C\":392:422 stateVar + this.f() + immutVar */ + pop tag_20 - /* \"C\":392:411 stateVar + this.f() */ + /* \"C\":392:422 stateVar + this.f() + immutVar */ tag_21 - dup7 - dup10 + /* \"C\":392:411 stateVar + this.f() */ + swap2 + /* \"C\":403:411 this.f() */ + 0x20 + /* \"C\":392:411 stateVar + this.f() */ + swap5 tag_1 jump\t// in - tag_21: + tag_20: /* \"C\":414:422 immutVar */ immutable(\"0xe4b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10\") /* \"C\":392:422 stateVar + this.f() + immutVar */ swap1 tag_1 jump\t// in - tag_20: + tag_21: /* \"D\":91:166 contract D is C(3)... */ swap1 mload @@ -582,8 +556,6 @@ sub_0: assembly { /* \"C\":403:411 this.f() */ tag_18: swap1 - swap2 - pop 0x20 returndatasize dup2 @@ -627,9 +599,8 @@ sub_0: assembly { pop mload /* \"C\":392:411 stateVar + this.f() */ - tag_21 + tag_20 /* \"C\":403:411 this.f() */ - 0x20 jump(tag_19) /* \"D\":91:166 contract D is C(3)... */ tag_26: @@ -652,20 +623,21 @@ sub_0: assembly { jump(tag_23) tag_16: /* \"D\":91:166 contract D is C(3)... */ - dup4 + dup3 mload - swap1 returndatasize - swap1 + 0x00 dup3 returndatacopy returndatasize swap1 revert tag_14: + /* \"C\":117:119 41 */ shl(0xe0, 0x4e487b71) + /* \"D\":91:166 contract D is C(3)... */ + 0x00 /* \"C\":117:119 41 */ - dup4 mstore 0x11 /* \"D\":91:166 contract D is C(3)... */ @@ -673,24 +645,22 @@ sub_0: assembly { /* \"C\":117:119 41 */ mstore 0x24 - dup4 + /* \"D\":91:166 contract D is C(3)... */ + 0x00 + /* \"C\":117:119 41 */ revert /* \"D\":91:166 contract D is C(3)... */ tag_12: - pop + 0x00 dup1 revert tag_6: pop jumpi(tag_12, callvalue) - dup2 - add(calldatasize, not(0x03)) - slt - tag_12 - jumpi + jumpi(tag_12, slt(add(not(0x03), calldatasize), 0x00)) 0x20 - swap2 - sload + swap1 + sload(0x00) swap1 mload swap1 @@ -698,22 +668,17 @@ sub_0: assembly { mstore return tag_4: - dup4 - swap1 jumpi(tag_12, callvalue) - dup2 - add(calldatasize, not(0x03)) - slt - tag_12 - jumpi + jumpi(tag_12, slt(add(not(0x03), calldatasize), 0x00)) /* \"C\":290:298 immutVar */ immutable(\"0xe4b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10\") /* \"C\":117:119 41 */ - dup1 - 0x29 - add swap1 dup2 + 0x29 + add + swap2 + dup3 slt 0x01 and @@ -721,8 +686,7 @@ sub_0: assembly { jumpi /* \"D\":91:166 contract D is C(3)... */ 0x20 - swap3 - pop + swap2 dup2 mstore return @@ -749,13 +713,9 @@ sub_0: assembly { iszero and or - tag_38 + tag_14 jumpi jump\t// out - tag_38: - mstore(0x00, shl(0xe0, 0x4e487b71)) - mstore(0x04, 0x11) - revert(0x00, 0x24) auxdata: } diff --git a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_all/output.json b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_all/output.json index 2fe90b70ef0b..ee958b55b029 100644 --- a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_all/output.json +++ b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_all/output.json @@ -194,12 +194,11 @@ object \"C_6\" { /// @src 0:60:101 \"contract C {...\" if iszero(lt(calldatasize(), 4)) { - let _1 := 0 - if eq(0x26121ff0, shr(224, calldataload(_1))) + if eq(0x26121ff0, shr(224, calldataload(0))) { - if callvalue() { revert(_1, _1) } - if slt(add(calldatasize(), not(3)), _1) { revert(_1, _1) } - return(_1, _1) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + return(0, 0) } } revert(0, 0) diff --git a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_location_only/output.json b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_location_only/output.json index 3600f633c8a8..007b7fc62bad 100644 --- a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_location_only/output.json +++ b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_location_only/output.json @@ -193,12 +193,11 @@ object \"C_6\" { /// @src 0:60:101 if iszero(lt(calldatasize(), 4)) { - let _1 := 0 - if eq(0x26121ff0, shr(224, calldataload(_1))) + if eq(0x26121ff0, shr(224, calldataload(0))) { - if callvalue() { revert(_1, _1) } - if slt(add(calldatasize(), not(3)), _1) { revert(_1, _1) } - return(_1, _1) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + return(0, 0) } } revert(0, 0) diff --git a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_none/output.json b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_none/output.json index 7393f8b44402..884da9eb9715 100644 --- a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_none/output.json +++ b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_none/output.json @@ -182,12 +182,11 @@ object \"C_6\" { { if iszero(lt(calldatasize(), 4)) { - let _1 := 0 - if eq(0x26121ff0, shr(224, calldataload(_1))) + if eq(0x26121ff0, shr(224, calldataload(0))) { - if callvalue() { revert(_1, _1) } - if slt(add(calldatasize(), not(3)), _1) { revert(_1, _1) } - return(_1, _1) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + return(0, 0) } } revert(0, 0) diff --git a/test/cmdlineTests/standard_debug_info_in_yul_location/output.json b/test/cmdlineTests/standard_debug_info_in_yul_location/output.json index d564db75a734..c563f8805290 100644 --- a/test/cmdlineTests/standard_debug_info_in_yul_location/output.json +++ b/test/cmdlineTests/standard_debug_info_in_yul_location/output.json @@ -658,78 +658,77 @@ object \"C_54\" { mstore(_2, _1) if iszero(lt(calldatasize(), 4)) { - let _3 := 0 - switch shr(224, calldataload(_3)) + switch shr(224, calldataload(0)) case 0x26121ff0 { - if callvalue() { revert(_3, _3) } - if slt(add(calldatasize(), not(3)), _3) { revert(_3, _3) } + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } /// @src 0:297:305 \"immutVar\" - let _4 := loadimmutable(\"8\") + let _3 := loadimmutable(\"8\") /// @src 0:79:435 \"contract C...\" - let sum := add(/** @src 0:124:126 \"41\" */ 0x29, /** @src 0:79:435 \"contract C...\" */ _4) - if and(1, slt(sum, _4)) + let sum := add(/** @src 0:124:126 \"41\" */ 0x29, /** @src 0:79:435 \"contract C...\" */ _3) + if and(1, slt(sum, _3)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(4, 0x11) - revert(_3, 0x24) + revert(0, 0x24) } mstore(_1, sum) return(_1, 32) } case 0x793816ec { - if callvalue() { revert(_3, _3) } - if slt(add(calldatasize(), not(3)), _3) { revert(_3, _3) } - let _5 := sload(_3) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + let _4 := sload(0) let memPos := mload(_2) - mstore(memPos, _5) + mstore(memPos, _4) return(memPos, 32) } case 0x9942ec6f { - if callvalue() { revert(_3, _3) } - if slt(add(calldatasize(), not(3)), _3) { revert(_3, _3) } - let _6 := sload(_3) - if eq(_6, sub(shl(255, 1), 1)) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + let _5 := sload(0) + if eq(_5, sub(shl(255, 1), 1)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(4, 0x11) - revert(_3, 0x24) + revert(0, 0x24) } - let ret := add(_6, 1) - sstore(_3, ret) + let ret := add(_5, 1) + sstore(0, ret) /// @src 0:410:418 \"this.f()\" - let _7 := /** @src 0:79:435 \"contract C...\" */ mload(_2) + let _6 := /** @src 0:79:435 \"contract C...\" */ mload(_2) /// @src 0:410:418 \"this.f()\" - mstore(_7, /** @src 0:79:435 \"contract C...\" */ shl(228, 0x026121ff)) + mstore(_6, /** @src 0:79:435 \"contract C...\" */ shl(228, 0x026121ff)) /// @src 0:410:418 \"this.f()\" - let _8 := staticcall(gas(), /** @src 0:410:414 \"this\" */ address(), /** @src 0:410:418 \"this.f()\" */ _7, /** @src 0:79:435 \"contract C...\" */ 4, /** @src 0:410:418 \"this.f()\" */ _7, 32) - if iszero(_8) + let _7 := staticcall(gas(), /** @src 0:410:414 \"this\" */ address(), /** @src 0:410:418 \"this.f()\" */ _6, /** @src 0:79:435 \"contract C...\" */ 4, /** @src 0:410:418 \"this.f()\" */ _6, 32) + if iszero(_7) { /// @src 0:79:435 \"contract C...\" let pos := mload(_2) - returndatacopy(pos, _3, returndatasize()) + returndatacopy(pos, 0, returndatasize()) revert(pos, returndatasize()) } /// @src 0:410:418 \"this.f()\" - let expr := /** @src 0:79:435 \"contract C...\" */ _3 + let expr := /** @src 0:79:435 \"contract C...\" */ 0 /// @src 0:410:418 \"this.f()\" - if _8 + if _7 { - let _9 := 32 - if gt(_9, returndatasize()) { _9 := returndatasize() } + let _8 := 32 + if gt(_8, returndatasize()) { _8 := returndatasize() } /// @src 0:79:435 \"contract C...\" - let newFreePtr := add(_7, and(add(_9, 31), not(31))) - if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, _7)) + let newFreePtr := add(_6, and(add(_8, 31), not(31))) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, _6)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(expr, shl(224, 0x4e487b71)) mstore(4, 0x41) - revert(_3, 0x24) + revert(expr, 0x24) } mstore(_2, newFreePtr) - if slt(sub(/** @src 0:410:418 \"this.f()\" */ add(_7, _9), /** @src 0:79:435 \"contract C...\" */ _7), /** @src 0:410:418 \"this.f()\" */ 32) + if slt(sub(/** @src 0:410:418 \"this.f()\" */ add(_6, _8), /** @src 0:79:435 \"contract C...\" */ _6), /** @src 0:410:418 \"this.f()\" */ 32) /// @src 0:79:435 \"contract C...\" - { revert(_3, _3) } + { revert(expr, expr) } /// @src 0:410:418 \"this.f()\" - expr := /** @src 0:79:435 \"contract C...\" */ mload(_7) + expr := /** @src 0:79:435 \"contract C...\" */ mload(_6) } /// @src 0:399:418 \"stateVar + this.f()\" let expr_1 := checked_add_int256(ret, expr) @@ -741,8 +740,8 @@ object \"C_54\" { return(memPos_1, /** @src 0:410:418 \"this.f()\" */ 32) } case /** @src 0:79:435 \"contract C...\" */ 0xa00b982b { - if callvalue() { revert(_3, _3) } - if slt(add(calldatasize(), not(3)), _3) { revert(_3, _3) } + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } let memPos_2 := mload(_2) mstore(memPos_2, /** @src 0:124:126 \"41\" */ 0x29) /// @src 0:79:435 \"contract C...\" @@ -1504,78 +1503,77 @@ object \"D_72\" { mstore(_2, _1) if iszero(lt(calldatasize(), 4)) { - let _3 := 0 - switch shr(224, calldataload(_3)) + switch shr(224, calldataload(0)) case 0x26121ff0 { - if callvalue() { revert(_3, _3) } - if slt(add(calldatasize(), not(3)), _3) { revert(_3, _3) } + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } /// @src 0:297:305 \"immutVar\" - let _4 := loadimmutable(\"8\") + let _3 := loadimmutable(\"8\") /// @src 1:91:166 \"contract D is C(3)...\" - let sum := add(/** @src 0:124:126 \"41\" */ 0x29, /** @src 1:91:166 \"contract D is C(3)...\" */ _4) - if and(1, slt(sum, _4)) + let sum := add(/** @src 0:124:126 \"41\" */ 0x29, /** @src 1:91:166 \"contract D is C(3)...\" */ _3) + if and(1, slt(sum, _3)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(4, 0x11) - revert(_3, 0x24) + revert(0, 0x24) } mstore(_1, sum) return(_1, 32) } case 0x793816ec { - if callvalue() { revert(_3, _3) } - if slt(add(calldatasize(), not(3)), _3) { revert(_3, _3) } - let _5 := sload(_3) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + let _4 := sload(0) let memPos := mload(_2) - mstore(memPos, _5) + mstore(memPos, _4) return(memPos, 32) } case 0x9942ec6f { - if callvalue() { revert(_3, _3) } - if slt(add(calldatasize(), not(3)), _3) { revert(_3, _3) } - let _6 := sload(_3) - if eq(_6, sub(shl(255, 1), 1)) + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } + let _5 := sload(0) + if eq(_5, sub(shl(255, 1), 1)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(4, 0x11) - revert(_3, 0x24) + revert(0, 0x24) } - let ret := add(_6, 1) - sstore(_3, ret) + let ret := add(_5, 1) + sstore(0, ret) /// @src 0:410:418 \"this.f()\" - let _7 := /** @src 1:91:166 \"contract D is C(3)...\" */ mload(_2) + let _6 := /** @src 1:91:166 \"contract D is C(3)...\" */ mload(_2) /// @src 0:410:418 \"this.f()\" - mstore(_7, /** @src 1:91:166 \"contract D is C(3)...\" */ shl(228, 0x026121ff)) + mstore(_6, /** @src 1:91:166 \"contract D is C(3)...\" */ shl(228, 0x026121ff)) /// @src 0:410:418 \"this.f()\" - let _8 := staticcall(gas(), /** @src 0:410:414 \"this\" */ address(), /** @src 0:410:418 \"this.f()\" */ _7, /** @src 1:91:166 \"contract D is C(3)...\" */ 4, /** @src 0:410:418 \"this.f()\" */ _7, 32) - if iszero(_8) + let _7 := staticcall(gas(), /** @src 0:410:414 \"this\" */ address(), /** @src 0:410:418 \"this.f()\" */ _6, /** @src 1:91:166 \"contract D is C(3)...\" */ 4, /** @src 0:410:418 \"this.f()\" */ _6, 32) + if iszero(_7) { /// @src 1:91:166 \"contract D is C(3)...\" let pos := mload(_2) - returndatacopy(pos, _3, returndatasize()) + returndatacopy(pos, 0, returndatasize()) revert(pos, returndatasize()) } /// @src 0:410:418 \"this.f()\" - let expr := /** @src 1:91:166 \"contract D is C(3)...\" */ _3 + let expr := /** @src 1:91:166 \"contract D is C(3)...\" */ 0 /// @src 0:410:418 \"this.f()\" - if _8 + if _7 { - let _9 := 32 - if gt(_9, returndatasize()) { _9 := returndatasize() } + let _8 := 32 + if gt(_8, returndatasize()) { _8 := returndatasize() } /// @src 1:91:166 \"contract D is C(3)...\" - let newFreePtr := add(_7, and(add(_9, 31), not(31))) - if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, _7)) + let newFreePtr := add(_6, and(add(_8, 31), not(31))) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, _6)) { - mstore(_3, shl(224, 0x4e487b71)) + mstore(expr, shl(224, 0x4e487b71)) mstore(4, 0x41) - revert(_3, 0x24) + revert(expr, 0x24) } mstore(_2, newFreePtr) - if slt(sub(/** @src 0:410:418 \"this.f()\" */ add(_7, _9), /** @src 1:91:166 \"contract D is C(3)...\" */ _7), /** @src 0:410:418 \"this.f()\" */ 32) + if slt(sub(/** @src 0:410:418 \"this.f()\" */ add(_6, _8), /** @src 1:91:166 \"contract D is C(3)...\" */ _6), /** @src 0:410:418 \"this.f()\" */ 32) /// @src 1:91:166 \"contract D is C(3)...\" - { revert(_3, _3) } + { revert(expr, expr) } /// @src 0:410:418 \"this.f()\" - expr := /** @src 1:91:166 \"contract D is C(3)...\" */ mload(_7) + expr := /** @src 1:91:166 \"contract D is C(3)...\" */ mload(_6) } /// @src 0:399:418 \"stateVar + this.f()\" let expr_1 := checked_add_int256(ret, expr) @@ -1587,8 +1585,8 @@ object \"D_72\" { return(memPos_1, /** @src 0:410:418 \"this.f()\" */ 32) } case /** @src 1:91:166 \"contract D is C(3)...\" */ 0xa00b982b { - if callvalue() { revert(_3, _3) } - if slt(add(calldatasize(), not(3)), _3) { revert(_3, _3) } + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } let memPos_2 := mload(_2) mstore(memPos_2, /** @src 0:124:126 \"41\" */ 0x29) /// @src 1:91:166 \"contract D is C(3)...\" diff --git a/test/cmdlineTests/viair_subobject_optimization/output b/test/cmdlineTests/viair_subobject_optimization/output index 4d5aa7f70d46..c9fefe051845 100644 --- a/test/cmdlineTests/viair_subobject_optimization/output +++ b/test/cmdlineTests/viair_subobject_optimization/output @@ -110,103 +110,87 @@ sub_0: assembly { dup1 revert tag_1: - 0x00 - dup1 - calldataload - 0xe0 - shr - 0x26121ff0 - eq - tag_3 - jumpi + jumpi(tag_3, eq(0x26121ff0, shr(0xe0, calldataload(0x00)))) 0x00 dup1 revert tag_3: jumpi(tag_7, callvalue) - dup1 - add(calldatasize, not(0x03)) - slt - tag_7 - jumpi + jumpi(tag_7, slt(add(not(0x03), calldatasize), 0x00)) /* "viair_subobject_optimization/input.sol":745:765 type(C).creationCode */ dataSize(sub_0) /* "viair_subobject_optimization/input.sol":669:772 contract D {... */ - swap2 - not(0x1f) swap1 - dup2 + not(0x1f) + dup1 0x3f - dup6 + dup5 add and - dup2 + dup3 add - swap3 - dup2 - dup5 + swap2 + dup1 + dup4 lt 0xffffffffffffffff - dup6 + dup5 gt or tag_9 jumpi + swap3 swap1 - swap2 0x40 - swap4 - dup5 + swap3 + dup4 mstore /* "viair_subobject_optimization/input.sol":745:765 type(C).creationCode */ + dup2 dup5 - dup4 mstore 0x20 - swap5 + swap2 dataOffset(sub_0) + dup4 dup7 - dup6 add codecopy /* "viair_subobject_optimization/input.sol":669:772 contract D {... */ - dup4 + dup3 mload - swap5 + swap4 + dup3 dup6 - swap3 - dup2 + swap4 dup5 mstore - dup5 + dup2 mload swap2 dup3 - dup2 + dup3 dup7 add mstore - dup2 - swap6 + 0x00 tag_11: dup4 - dup8 + dup2 lt tag_12 jumpi pop pop + 0x00 + dup5 dup4 - swap5 - pop - dup6 - dup3 - 0x1f - swap5 - swap6 add + dup7 add mstore + pop + 0x1f add and dup2 @@ -216,35 +200,30 @@ sub_0: assembly { swap1 return tag_12: - dup7 + dup2 dup2 add - dup3 + dup4 add mload - dup10 dup9 + dup3 add - dup10 + dup9 add mstore - swap6 - dup2 - add - swap6 - dup9 + dup8 swap6 pop + dup3 + add jump(tag_11) tag_9: - shl(0xe0, 0x4e487b71) - dup2 - mstore + mstore(0x00, shl(0xe0, 0x4e487b71)) mstore(0x04, 0x41) - 0x24 - swap1 - revert + revert(0x00, 0x24) tag_7: + 0x00 dup1 revert stop diff --git a/test/cmdlineTests/viair_subobjects/output b/test/cmdlineTests/viair_subobjects/output index 500472f8a884..7a6bc8e6570b 100644 --- a/test/cmdlineTests/viair_subobjects/output +++ b/test/cmdlineTests/viair_subobjects/output @@ -59,31 +59,30 @@ object "D_16" { mstore(64, _1) if iszero(lt(calldatasize(), 4)) { - let _2 := 0 - if eq(0x26121ff0, shr(224, calldataload(_2))) + if eq(0x26121ff0, shr(224, calldataload(0))) { - if callvalue() { revert(_2, _2) } - if slt(add(calldatasize(), not(3)), _2) { revert(_2, _2) } + if callvalue() { revert(0, 0) } + if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } /// @src 0:149:156 "new C()" - let _3 := datasize("C_3") - let _4 := add(_1, _3) - if or(gt(_4, 0xffffffffffffffff), lt(_4, _1)) + let _2 := datasize("C_3") + let _3 := add(_1, _2) + if or(gt(_3, 0xffffffffffffffff), lt(_3, _1)) { /// @src 0:96:165 "contract D {..." - mstore(_2, shl(224, 0x4e487b71)) + mstore(0, shl(224, 0x4e487b71)) mstore(4, 0x41) - revert(_2, 0x24) + revert(0, 0x24) } /// @src 0:149:156 "new C()" - datacopy(_1, dataoffset("C_3"), _3) - if iszero(create(/** @src 0:96:165 "contract D {..." */ _2, /** @src 0:149:156 "new C()" */ _1, sub(_4, _1))) + datacopy(_1, dataoffset("C_3"), _2) + if iszero(create(/** @src 0:96:165 "contract D {..." */ 0, /** @src 0:149:156 "new C()" */ _1, sub(_3, _1))) { /// @src 0:96:165 "contract D {..." let pos := mload(64) - returndatacopy(pos, _2, returndatasize()) + returndatacopy(pos, 0, returndatasize()) revert(pos, returndatasize()) } - return(_2, _2) + return(0, 0) } } revert(0, 0) diff --git a/test/libsolidity/gasTests/abiv2_optimised.sol b/test/libsolidity/gasTests/abiv2_optimised.sol index 2d4100df48b8..608d1c8ba310 100644 --- a/test/libsolidity/gasTests/abiv2_optimised.sol +++ b/test/libsolidity/gasTests/abiv2_optimised.sol @@ -17,9 +17,9 @@ contract C { // optimize-yul: true // ---- // creation: -// codeDepositCost: 640600 -// executionCost: 674 -// totalCost: 641274 +// codeDepositCost: 638600 +// executionCost: 668 +// totalCost: 639268 // external: // a(): 2283 // b(uint256): 4649 diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_storage.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_storage.sol index c13f004fba41..b4ef43c44172 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_storage.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_storage.sol @@ -21,6 +21,6 @@ contract C { } // ---- // f() -> 0x20, 0x8, 0x40, 0x3, 0x9, 0xa, 0xb -// gas irOptimized: 203166 +// gas irOptimized: 203149 // gas legacy: 206263 -// gas legacyOptimized: 203151 +// gas legacyOptimized: 203156 diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_calldata_slice.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_calldata_slice.sol index e043853e09e1..fe38d8078afa 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_calldata_slice.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_calldata_slice.sol @@ -59,10 +59,10 @@ contract C { // EVMVersion: >homestead // ---- // test_bytes() -> -// gas irOptimized: 361321 +// gas irOptimized: 360827 // gas legacy: 411269 // gas legacyOptimized: 317754 // test_uint256() -> -// gas irOptimized: 509988 +// gas irOptimized: 509533 // gas legacy: 577469 // gas legacyOptimized: 440931 diff --git a/test/libsolidity/semanticTests/abiEncoderV1/struct/struct_storage_ptr.sol b/test/libsolidity/semanticTests/abiEncoderV1/struct/struct_storage_ptr.sol index 575b759074d6..9edb07a18caa 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/struct/struct_storage_ptr.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/struct/struct_storage_ptr.sol @@ -24,6 +24,6 @@ contract C { // ---- // library: L // f() -> 8, 7, 1, 2, 7, 12 -// gas irOptimized: 166506 +// gas irOptimized: 166467 // gas legacy: 169283 // gas legacyOptimized: 167248 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_calldata_slice.sol b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_calldata_slice.sol index 8d98179d91e9..beb283664ebd 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_calldata_slice.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_calldata_slice.sol @@ -60,10 +60,10 @@ contract C { // EVMVersion: >homestead // ---- // test_bytes() -> -// gas irOptimized: 361321 +// gas irOptimized: 360827 // gas legacy: 411269 // gas legacyOptimized: 317754 // test_uint256() -> -// gas irOptimized: 509988 +// gas irOptimized: 509533 // gas legacy: 577469 // gas legacyOptimized: 440931 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2.sol b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2.sol index cdf2d3087d35..5e50d5e9a807 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2.sol @@ -50,6 +50,6 @@ contract C { // f2() -> 0x20, 0xa0, 0x1, 0x60, 0x2, 0x3, "abc" // f3() -> 0x20, 0xa0, 0x1, 0x60, 0x2, 0x3, "abc" // f4() -> 0x20, 0x160, 0x1, 0x80, 0xc0, 0x2, 0x3, "abc", 0x7, 0x40, 0x2, 0x2, 0x3 -// gas irOptimized: 112641 +// gas irOptimized: 112630 // gas legacy: 114794 // gas legacyOptimized: 112572 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2_in_function_inherited_in_v1_contract.sol b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2_in_function_inherited_in_v1_contract.sol index add5458967ff..901e158dbcf6 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2_in_function_inherited_in_v1_contract.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2_in_function_inherited_in_v1_contract.sol @@ -30,6 +30,6 @@ contract C is B { } // ---- // test() -> 77 -// gas irOptimized: 119177 +// gas irOptimized: 110731 // gas legacy: 151866 // gas legacyOptimized: 110359 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/calldata_array.sol b/test/libsolidity/semanticTests/abiEncoderV2/calldata_array.sol index 915514754a97..bd8517a9592d 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/calldata_array.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/calldata_array.sol @@ -20,6 +20,6 @@ contract C { // f(uint256[][1]): 32, 32, 0 -> true // f(uint256[][1]): 32, 32, 1, 42 -> true // f(uint256[][1]): 32, 32, 8, 421, 422, 423, 424, 425, 426, 427, 428 -> true -// gas irOptimized: 127012 +// gas irOptimized: 126849 // gas legacy: 139800 // gas legacyOptimized: 119092 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_dynamic_arrays.sol b/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_dynamic_arrays.sol index 796488a9fe4a..2af8b8cde97b 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_dynamic_arrays.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_dynamic_arrays.sol @@ -33,7 +33,7 @@ contract C { // f_which(uint256[],uint256[2],uint256): 0x40, 1, 2, 1, 5, 6 -> 0x20, 0x40, 5, 2 // f_which(uint256[],uint256[2],uint256): 0x40, 1, 2, 1 -> FAILURE // f_storage(uint256[],uint256[2]): 0x20, 1, 2 -> 0x20, 0x60, 0x20, 1, 2 -// gas irOptimized: 111650 +// gas irOptimized: 111639 // gas legacy: 112944 // gas legacyOptimized: 112092 // f_storage(uint256[],uint256[2]): 0x40, 1, 2, 5, 6 -> 0x20, 0x80, 0x20, 2, 5, 6 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/storage_array_encoding.sol b/test/libsolidity/semanticTests/abiEncoderV2/storage_array_encoding.sol index c72ac0075079..6685776d06ab 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/storage_array_encoding.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/storage_array_encoding.sol @@ -18,10 +18,10 @@ contract C { // EVMVersion: >homestead // ---- // h(uint256[2][]): 0x20, 3, 123, 124, 223, 224, 323, 324 -> 32, 256, 0x20, 3, 123, 124, 223, 224, 323, 324 -// gas irOptimized: 180823 +// gas irOptimized: 180808 // gas legacy: 184830 // gas legacyOptimized: 181493 // i(uint256[2][2]): 123, 124, 223, 224 -> 32, 128, 123, 124, 223, 224 -// gas irOptimized: 112459 +// gas irOptimized: 112425 // gas legacy: 115398 // gas legacyOptimized: 112982 diff --git a/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple_storage.sol b/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple_storage.sol index 03084f0a35b6..c0c2fbfe38d7 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple_storage.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple_storage.sol @@ -8,6 +8,6 @@ contract C { } // ---- // f(bytes): 0x20, 0x80, 0x21, 0x40, 0x7, "abcdefg" -> 0x21, 0x40, 0x7, "abcdefg" -// gas irOptimized: 135693 +// gas irOptimized: 135662 // gas legacy: 137278 -// gas legacyOptimized: 136043 +// gas legacyOptimized: 136048 diff --git a/test/libsolidity/semanticTests/array/array_memory_index_access.sol b/test/libsolidity/semanticTests/array/array_memory_index_access.sol index 116582415fc1..1e75afeffc2e 100644 --- a/test/libsolidity/semanticTests/array/array_memory_index_access.sol +++ b/test/libsolidity/semanticTests/array/array_memory_index_access.sol @@ -26,7 +26,7 @@ contract C { // index(uint256): 10 -> true // index(uint256): 20 -> true // index(uint256): 0xFF -> true -// gas irOptimized: 135073 +// gas irOptimized: 135060 // gas legacy: 241703 // gas legacyOptimized: 151613 // accessIndex(uint256,int256): 10, 1 -> 2 diff --git a/test/libsolidity/semanticTests/array/array_storage_index_access.sol b/test/libsolidity/semanticTests/array/array_storage_index_access.sol index 1b6e461a364b..1ea50824fd71 100644 --- a/test/libsolidity/semanticTests/array/array_storage_index_access.sol +++ b/test/libsolidity/semanticTests/array/array_storage_index_access.sol @@ -16,38 +16,38 @@ contract C { // ---- // test_indices(uint256): 1 -> // test_indices(uint256): 129 -> -// gas irOptimized: 3019936 +// gas irOptimized: 3016570 // gas legacy: 3069098 // gas legacyOptimized: 3013250 // test_indices(uint256): 5 -> -// gas irOptimized: 577789 +// gas irOptimized: 576716 // gas legacy: 574754 // gas legacyOptimized: 572383 // test_indices(uint256): 10 -> -// gas irOptimized: 158291 +// gas irOptimized: 158059 // gas legacy: 162468 // gas legacyOptimized: 158336 // test_indices(uint256): 15 -> -// gas irOptimized: 173296 +// gas irOptimized: 172984 // gas legacy: 179513 // gas legacyOptimized: 173606 // test_indices(uint256): 0xFF -> -// gas irOptimized: 5678606 +// gas irOptimized: 5672104 // gas legacy: 5775928 // gas legacyOptimized: 5666726 // test_indices(uint256): 1000 -> -// gas irOptimized: 18197173 +// gas irOptimized: 18173701 // gas legacy: 18583810 // gas legacyOptimized: 18171248 // test_indices(uint256): 129 -> -// gas irOptimized: 4156312 +// gas irOptimized: 4147676 // gas legacy: 4164468 // gas legacyOptimized: 4122100 // test_indices(uint256): 128 -> -// gas irOptimized: 411289 +// gas irOptimized: 409209 // gas legacy: 463706 // gas legacyOptimized: 418061 // test_indices(uint256): 1 -> -// gas irOptimized: 581362 +// gas irOptimized: 580316 // gas legacy: 576904 // gas legacyOptimized: 575649 diff --git a/test/libsolidity/semanticTests/array/array_storage_index_boundary_test.sol b/test/libsolidity/semanticTests/array/array_storage_index_boundary_test.sol index ffe98ee43002..a9e4fd8d3380 100644 --- a/test/libsolidity/semanticTests/array/array_storage_index_boundary_test.sol +++ b/test/libsolidity/semanticTests/array/array_storage_index_boundary_test.sol @@ -16,11 +16,11 @@ contract C { // test_boundary_check(uint256,uint256): 1, 1 -> FAILURE, hex"4e487b71", 0x32 // test_boundary_check(uint256,uint256): 10, 10 -> FAILURE, hex"4e487b71", 0x32 // test_boundary_check(uint256,uint256): 256, 256 -> FAILURE, hex"4e487b71", 0x32 -// gas irOptimized: 140383 +// gas irOptimized: 137904 // gas legacy: 133633 // gas legacyOptimized: 114354 // test_boundary_check(uint256,uint256): 256, 255 -> 0 -// gas irOptimized: 142515 +// gas irOptimized: 140039 // gas legacy: 135949 // gas legacyOptimized: 116533 // test_boundary_check(uint256,uint256): 256, 0xFFFF -> FAILURE, hex"4e487b71", 0x32 diff --git a/test/libsolidity/semanticTests/array/array_storage_index_zeroed_test.sol b/test/libsolidity/semanticTests/array/array_storage_index_zeroed_test.sol index 6b3f4643cb5f..836901963e62 100644 --- a/test/libsolidity/semanticTests/array/array_storage_index_zeroed_test.sol +++ b/test/libsolidity/semanticTests/array/array_storage_index_zeroed_test.sol @@ -52,18 +52,18 @@ contract C { // ---- // test_zeroed_indicies(uint256): 1 -> // test_zeroed_indicies(uint256): 5 -> -// gas irOptimized: 131925 +// gas irOptimized: 131804 // gas legacy: 132804 // gas legacyOptimized: 130649 // test_zeroed_indicies(uint256): 10 -> -// gas irOptimized: 225874 +// gas irOptimized: 225692 // gas legacy: 227786 // gas legacyOptimized: 223830 // test_zeroed_indicies(uint256): 15 -> -// gas irOptimized: 323938 +// gas irOptimized: 323700 // gas legacy: 326902 // gas legacyOptimized: 321206 // test_zeroed_indicies(uint256): 0xFF -> -// gas irOptimized: 5116738 +// gas irOptimized: 5112496 // gas legacy: 5165874 // gas legacyOptimized: 5062182 diff --git a/test/libsolidity/semanticTests/array/array_storage_length_access.sol b/test/libsolidity/semanticTests/array/array_storage_length_access.sol index 6a611cc17115..0669a320971d 100644 --- a/test/libsolidity/semanticTests/array/array_storage_length_access.sol +++ b/test/libsolidity/semanticTests/array/array_storage_length_access.sol @@ -16,7 +16,7 @@ contract C { // gas legacy: 128571 // gas legacyOptimized: 110143 // set_get_length(uint256): 0xFFF -> 0xFFF -// gas irOptimized: 1220647 +// gas irOptimized: 1209119 // gas legacy: 1689548 // gas legacyOptimized: 1393535 // set_get_length(uint256): 0xFFFFF -> FAILURE # Out-of-gas # diff --git a/test/libsolidity/semanticTests/array/array_storage_push_empty.sol b/test/libsolidity/semanticTests/array/array_storage_push_empty.sol index b59afd039163..9949b59ea493 100644 --- a/test/libsolidity/semanticTests/array/array_storage_push_empty.sol +++ b/test/libsolidity/semanticTests/array/array_storage_push_empty.sol @@ -12,11 +12,11 @@ contract C { // EVMVersion: >=petersburg // ---- // pushEmpty(uint256): 128 -// gas irOptimized: 406413 +// gas irOptimized: 404095 // gas legacy: 415744 // gas legacyOptimized: 397380 // pushEmpty(uint256): 256 -// gas irOptimized: 693185 +// gas irOptimized: 689843 // gas legacy: 715316 // gas legacyOptimized: 688632 // pushEmpty(uint256): 38869 -> FAILURE # out-of-gas # diff --git a/test/libsolidity/semanticTests/array/array_storage_push_empty_length_address.sol b/test/libsolidity/semanticTests/array/array_storage_push_empty_length_address.sol index 9c3a426fe9cf..4b5b407eaff5 100644 --- a/test/libsolidity/semanticTests/array/array_storage_push_empty_length_address.sol +++ b/test/libsolidity/semanticTests/array/array_storage_push_empty_length_address.sol @@ -21,11 +21,11 @@ contract C { // gas legacy: 77730 // gas legacyOptimized: 77162 // set_get_length(uint256): 0xFF -> 0xFF -// gas irOptimized: 161440 +// gas irOptimized: 158881 // gas legacy: 696850 // gas legacyOptimized: 134488 // set_get_length(uint256): 0xFFF -> 0xFFF -// gas irOptimized: 1800622 +// gas irOptimized: 1762213 // gas legacy: 9857362 // gas legacyOptimized: 1393660 // set_get_length(uint256): 0xFFFFF -> FAILURE # Out-of-gas # diff --git a/test/libsolidity/semanticTests/array/array_storage_push_pop.sol b/test/libsolidity/semanticTests/array/array_storage_push_pop.sol index 91948540f919..5befbe2282b2 100644 --- a/test/libsolidity/semanticTests/array/array_storage_push_pop.sol +++ b/test/libsolidity/semanticTests/array/array_storage_push_pop.sol @@ -17,11 +17,11 @@ contract C { // gas legacy: 105722 // gas legacyOptimized: 103508 // set_get_length(uint256): 0xFF -> 0 -// gas irOptimized: 821106 +// gas irOptimized: 815997 // gas legacy: 808020 // gas legacyOptimized: 784467 // set_get_length(uint256): 0xFFF -> 0 -// gas irOptimized: 12828798 +// gas irOptimized: 12746889 // gas legacy: 12612192 // gas legacyOptimized: 12239199 // set_get_length(uint256): 0xFFFF -> FAILURE # Out-of-gas # diff --git a/test/libsolidity/semanticTests/array/arrays_complex_from_and_to_storage.sol b/test/libsolidity/semanticTests/array/arrays_complex_from_and_to_storage.sol index 05a663c0beef..715e8a589cb8 100644 --- a/test/libsolidity/semanticTests/array/arrays_complex_from_and_to_storage.sol +++ b/test/libsolidity/semanticTests/array/arrays_complex_from_and_to_storage.sol @@ -12,7 +12,7 @@ contract Test { } // ---- // set(uint24[3][]): 0x20, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12 -> 0x06 -// gas irOptimized: 186537 +// gas irOptimized: 186554 // gas legacy: 211054 // gas legacyOptimized: 206042 // data(uint256,uint256): 0x02, 0x02 -> 0x09 diff --git a/test/libsolidity/semanticTests/array/byte_array_transitional_2.sol b/test/libsolidity/semanticTests/array/byte_array_transitional_2.sol index 554f4361a133..92f58bd110f0 100644 --- a/test/libsolidity/semanticTests/array/byte_array_transitional_2.sol +++ b/test/libsolidity/semanticTests/array/byte_array_transitional_2.sol @@ -17,6 +17,6 @@ contract c { } // ---- // test() -> 0 -// gas irOptimized: 125584 +// gas irOptimized: 125212 // gas legacy: 150372 // gas legacyOptimized: 146391 diff --git a/test/libsolidity/semanticTests/array/bytes_length_member.sol b/test/libsolidity/semanticTests/array/bytes_length_member.sol index 04dcf2d34084..750467a21212 100644 --- a/test/libsolidity/semanticTests/array/bytes_length_member.sol +++ b/test/libsolidity/semanticTests/array/bytes_length_member.sol @@ -13,7 +13,7 @@ contract c { // ---- // getLength() -> 0 // set(): 1, 2 -> true -// gas irOptimized: 110400 +// gas irOptimized: 110392 // gas legacy: 110952 -// gas legacyOptimized: 110580 +// gas legacyOptimized: 110579 // getLength() -> 68 diff --git a/test/libsolidity/semanticTests/array/constant_var_as_array_length.sol b/test/libsolidity/semanticTests/array/constant_var_as_array_length.sol index fe6f07a40e5d..ca65f070657c 100644 --- a/test/libsolidity/semanticTests/array/constant_var_as_array_length.sol +++ b/test/libsolidity/semanticTests/array/constant_var_as_array_length.sol @@ -8,7 +8,7 @@ contract C { } // ---- // constructor(): 1, 2, 3 -> -// gas irOptimized: 140952 +// gas irOptimized: 139656 // gas legacy: 180517 // gas legacyOptimized: 150462 // a(uint256): 0 -> 1 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_calldata_storage.sol b/test/libsolidity/semanticTests/array/copying/array_copy_calldata_storage.sol index 3be5ba29f4d8..7d521987840a 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_calldata_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_calldata_storage.sol @@ -20,7 +20,7 @@ contract c { } // ---- // store(uint256[9],uint8[3][]): 21, 22, 23, 24, 25, 26, 27, 28, 29, 0x140, 4, 1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33 -> 32 -// gas irOptimized: 648323 +// gas irOptimized: 648319 // gas legacy: 694356 // gas legacyOptimized: 693864 // retrieve() -> 9, 28, 9, 28, 4, 3, 32 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_cleanup_uint40.sol b/test/libsolidity/semanticTests/array/copying/array_copy_cleanup_uint40.sol index d88aaebcdac4..a06ee7f89a13 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_cleanup_uint40.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_cleanup_uint40.sol @@ -46,6 +46,6 @@ contract C { } // ---- // f() -> true -// gas irOptimized: 117369 +// gas irOptimized: 117261 // gas legacy: 124660 // gas legacyOptimized: 122801 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_clear_storage.sol b/test/libsolidity/semanticTests/array/copying/array_copy_clear_storage.sol index ebc6dadbe76f..0bdcda1d9e7f 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_clear_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_clear_storage.sol @@ -13,6 +13,6 @@ contract C { } // ---- // f() -> 0 -// gas irOptimized: 107488 +// gas irOptimized: 107453 // gas legacy: 108218 // gas legacyOptimized: 107625 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_different_packing.sol b/test/libsolidity/semanticTests/array/copying/array_copy_different_packing.sol index 6f616f4b5328..6d83f3758cfa 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_different_packing.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_different_packing.sol @@ -18,6 +18,6 @@ contract c { } // ---- // test() -> 0x01000000000000000000000000000000000000000000000000, 0x02000000000000000000000000000000000000000000000000, 0x03000000000000000000000000000000000000000000000000, 0x04000000000000000000000000000000000000000000000000, 0x05000000000000000000000000000000000000000000000000 -// gas irOptimized: 208122 +// gas irOptimized: 208044 // gas legacy: 221769 // gas legacyOptimized: 220611 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_including_array.sol b/test/libsolidity/semanticTests/array/copying/array_copy_including_array.sol index 80364f02578d..d28090277aaa 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_including_array.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_including_array.sol @@ -35,12 +35,12 @@ contract c { } // ---- // test() -> 0x02000202 -// gas irOptimized: 4548245 +// gas irOptimized: 4548150 // gas legacy: 4476222 // gas legacyOptimized: 4448113 // storageEmpty -> 1 // clear() -> 0, 0 -// gas irOptimized: 4475224 +// gas irOptimized: 4475134 // gas legacy: 4408014 // gas legacyOptimized: 4381784 // storageEmpty -> 1 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_nested_array.sol b/test/libsolidity/semanticTests/array/copying/array_copy_nested_array.sol index 7b5b30b79fd1..4297f11fc25c 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_nested_array.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_nested_array.sol @@ -12,6 +12,6 @@ contract c { } // ---- // test(uint256[2][]): 32, 3, 7, 8, 9, 10, 11, 12 -> 10 -// gas irOptimized: 689714 +// gas irOptimized: 689666 // gas legacy: 686178 // gas legacyOptimized: 685628 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base.sol index d17e45a2f3ed..911653b37497 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base.sol @@ -17,6 +17,6 @@ contract c { } // ---- // test() -> 5, 4 -// gas irOptimized: 205062 +// gas irOptimized: 205045 // gas legacy: 213863 // gas legacyOptimized: 212902 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base_nested.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base_nested.sol index 4ab3d0bd870c..f75338bb74ed 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base_nested.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base_nested.sol @@ -21,6 +21,6 @@ contract c { } // ---- // test() -> 3, 4 -// gas irOptimized: 169602 +// gas irOptimized: 169586 // gas legacy: 175424 // gas legacyOptimized: 172535 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dyn_dyn.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dyn_dyn.sol index 29c845f13065..99dd1ca934ff 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dyn_dyn.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dyn_dyn.sol @@ -15,7 +15,7 @@ contract c { // ---- // setData1(uint256,uint256,uint256): 10, 5, 4 -> // copyStorageStorage() -> -// gas irOptimized: 111366 +// gas irOptimized: 111348 // gas legacy: 109272 // gas legacyOptimized: 109262 // getData2(uint256): 5 -> 10, 4 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dynamic_dynamic.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dynamic_dynamic.sol index fcdcf9c2d2c4..30173409eb77 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dynamic_dynamic.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dynamic_dynamic.sol @@ -17,6 +17,6 @@ contract c { } // ---- // test() -> 5, 4 -// gas irOptimized: 252986 +// gas irOptimized: 252929 // gas legacy: 250892 // gas legacyOptimized: 250046 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_dynamic.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_dynamic.sol index 943a5206eef4..13cd7ed0cead 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_dynamic.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_dynamic.sol @@ -11,6 +11,6 @@ contract c { } // ---- // test() -> 9, 4 -// gas irOptimized: 123142 +// gas irOptimized: 123136 // gas legacy: 123567 // gas legacyOptimized: 123202 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_static.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_static.sol index 3b0a229c96f1..0d613e5e946b 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_static.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_static.sol @@ -14,6 +14,6 @@ contract c { } // ---- // test() -> 8, 0 -// gas irOptimized: 196278 +// gas irOptimized: 196259 // gas legacy: 194843 // gas legacyOptimized: 194281 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_struct.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_struct.sol index 4339c89b5506..cfb623393c87 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_struct.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_struct.sol @@ -17,7 +17,7 @@ contract c { } // ---- // test() -> 4, 5 -// gas irOptimized: 190870 +// gas irOptimized: 190694 // gas legacy: 190852 // gas legacyOptimized: 189658 // storageEmpty -> 1 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_to_memory_nested.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_to_memory_nested.sol index c9c6e32284b9..86c76e765151 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_to_memory_nested.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_to_memory_nested.sol @@ -15,6 +15,6 @@ contract C { } // ---- // f() -> 0x20, 2, 0x40, 0xa0, 2, 0, 1, 2, 2, 3 -// gas irOptimized: 161715 +// gas irOptimized: 161627 // gas legacy: 162203 -// gas legacyOptimized: 159941 +// gas legacyOptimized: 159934 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover.sol b/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover.sol index 31addad5ecab..74d2ab9096fc 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover.sol @@ -17,6 +17,6 @@ contract c { } // ---- // test() -> 0xffffffff, 0x0000000000000000000000000a00090008000700060005000400030002000100, 0x0000000000000000000000000000000000000000000000000000000000000000 -// gas irOptimized: 104665 +// gas irOptimized: 104534 // gas legacy: 166874 // gas legacyOptimized: 145474 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_target_simple.sol b/test/libsolidity/semanticTests/array/copying/array_copy_target_simple.sol index 0a306cade434..b2290598985f 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_target_simple.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_target_simple.sol @@ -18,6 +18,6 @@ contract c { } // ---- // test() -> 0x01000000000000000000000000000000000000000000000000, 0x02000000000000000000000000000000000000000000000000, 0x03000000000000000000000000000000000000000000000000, 0x04000000000000000000000000000000000000000000000000, 0x0 -// gas irOptimized: 273576 +// gas irOptimized: 273564 // gas legacy: 283666 // gas legacyOptimized: 282023 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_target_simple_2.sol b/test/libsolidity/semanticTests/array/copying/array_copy_target_simple_2.sol index de100d0964d6..ad4c5818b6e8 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_target_simple_2.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_target_simple_2.sol @@ -18,6 +18,6 @@ contract c { } // ---- // test() -> 0x01000000000000000000000000000000000000000000000000, 0x02000000000000000000000000000000000000000000000000, 0x03000000000000000000000000000000000000000000000000, 0x04000000000000000000000000000000000000000000000000, 0x00 -// gas irOptimized: 233285 +// gas irOptimized: 233271 // gas legacy: 236523 // gas legacyOptimized: 235592 diff --git a/test/libsolidity/semanticTests/array/copying/array_elements_to_mapping.sol b/test/libsolidity/semanticTests/array/copying/array_elements_to_mapping.sol index 53ca44cdc5b3..b1e8659be8df 100644 --- a/test/libsolidity/semanticTests/array/copying/array_elements_to_mapping.sol +++ b/test/libsolidity/semanticTests/array/copying/array_elements_to_mapping.sol @@ -52,9 +52,9 @@ contract C { } // ---- // from_storage() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 -// gas irOptimized: 150061 +// gas irOptimized: 150004 // gas legacy: 150745 -// gas legacyOptimized: 148685 +// gas legacyOptimized: 148678 // from_storage_ptr() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 // from_memory() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 // from_calldata(uint8[][]): 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 diff --git a/test/libsolidity/semanticTests/array/copying/array_nested_calldata_to_storage.sol b/test/libsolidity/semanticTests/array/copying/array_nested_calldata_to_storage.sol index 8cc849ecdc7b..ad79a5ec53d1 100644 --- a/test/libsolidity/semanticTests/array/copying/array_nested_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/array_nested_calldata_to_storage.sol @@ -38,10 +38,10 @@ contract c { // compileViaYul: true // ---- // test1(uint256[][]): 0x20, 2, 0x40, 0x40, 2, 23, 42 -> 2, 65 -// gas irOptimized: 180759 +// gas irOptimized: 180716 // test2(uint256[][2]): 0x20, 0x40, 0x40, 2, 23, 42 -> 2, 65 -// gas irOptimized: 157562 +// gas irOptimized: 157544 // test3(uint256[2][]): 0x20, 2, 23, 42, 23, 42 -> 2, 65 -// gas irOptimized: 134637 +// gas irOptimized: 134629 // test4(uint256[2][2]): 23, 42, 23, 42 -> 65 -// gas irOptimized: 111270 +// gas irOptimized: 111252 diff --git a/test/libsolidity/semanticTests/array/copying/array_nested_memory_to_storage.sol b/test/libsolidity/semanticTests/array/copying/array_nested_memory_to_storage.sol index 08e427eea53f..9bd19d629965 100644 --- a/test/libsolidity/semanticTests/array/copying/array_nested_memory_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/array_nested_memory_to_storage.sol @@ -38,12 +38,12 @@ contract Test { } // ---- // test() -> 24 -// gas irOptimized: 226687 +// gas irOptimized: 226661 // gas legacy: 227084 // gas legacyOptimized: 226529 // test1() -> 3 // test2() -> 6 // test3() -> 24 -// gas irOptimized: 141244 +// gas irOptimized: 141223 // gas legacy: 142238 // gas legacyOptimized: 141365 diff --git a/test/libsolidity/semanticTests/array/copying/array_of_function_external_storage_to_storage_dynamic.sol b/test/libsolidity/semanticTests/array/copying/array_of_function_external_storage_to_storage_dynamic.sol index 9a2ab14cbbd2..01329504d2a9 100644 --- a/test/libsolidity/semanticTests/array/copying/array_of_function_external_storage_to_storage_dynamic.sol +++ b/test/libsolidity/semanticTests/array/copying/array_of_function_external_storage_to_storage_dynamic.sol @@ -45,7 +45,7 @@ contract C { } // ---- // copyExternalStorageArrayOfFunctionType() -> true -// gas irOptimized: 104606 +// gas irOptimized: 104592 // gas legacy: 108554 // gas legacyOptimized: 102413 // copyInternalArrayOfFunctionType() -> true diff --git a/test/libsolidity/semanticTests/array/copying/array_of_function_external_storage_to_storage_dynamic_different_mutability.sol b/test/libsolidity/semanticTests/array/copying/array_of_function_external_storage_to_storage_dynamic_different_mutability.sol index dc30e44b6fde..50756d0b0c3d 100644 --- a/test/libsolidity/semanticTests/array/copying/array_of_function_external_storage_to_storage_dynamic_different_mutability.sol +++ b/test/libsolidity/semanticTests/array/copying/array_of_function_external_storage_to_storage_dynamic_different_mutability.sol @@ -48,7 +48,7 @@ contract C { } // ---- // copyExternalStorageArraysOfFunctionType() -> true -// gas irOptimized: 104279 +// gas irOptimized: 104265 // gas legacy: 108295 // gas legacyOptimized: 102146 // copyInternalArrayOfFunctionType() -> true diff --git a/test/libsolidity/semanticTests/array/copying/array_of_struct_calldata_to_storage.sol b/test/libsolidity/semanticTests/array/copying/array_of_struct_calldata_to_storage.sol index ec193d693ae5..b908649a2395 100644 --- a/test/libsolidity/semanticTests/array/copying/array_of_struct_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/array_of_struct_calldata_to_storage.sol @@ -17,4 +17,4 @@ contract C { // compileViaYul: true // ---- // f((uint128,uint64,uint128)[]): 0x20, 3, 0, 0, 12, 0, 11, 0, 10, 0, 0 -> 10, 11, 12 -// gas irOptimized: 119736 +// gas irOptimized: 119691 diff --git a/test/libsolidity/semanticTests/array/copying/array_of_struct_memory_to_storage.sol b/test/libsolidity/semanticTests/array/copying/array_of_struct_memory_to_storage.sol index 3024f44adcd1..32deb9e06e0c 100644 --- a/test/libsolidity/semanticTests/array/copying/array_of_struct_memory_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/array_of_struct_memory_to_storage.sol @@ -19,4 +19,4 @@ contract C { // compileViaYul: true // ---- // f() -> 10, 11, 12 -// gas irOptimized: 118393 +// gas irOptimized: 118360 diff --git a/test/libsolidity/semanticTests/array/copying/array_of_structs_containing_arrays_calldata_to_storage.sol b/test/libsolidity/semanticTests/array/copying/array_of_structs_containing_arrays_calldata_to_storage.sol index b60a7c3c2a5a..e3998e955124 100644 --- a/test/libsolidity/semanticTests/array/copying/array_of_structs_containing_arrays_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/array_of_structs_containing_arrays_calldata_to_storage.sol @@ -23,4 +23,4 @@ contract C { // compileViaYul: true // ---- // f((uint256[])[]): 0x20, 3, 0x60, 0x60, 0x60, 0x20, 3, 1, 2, 3 -> 3, 1 -// gas irOptimized: 327759 +// gas irOptimized: 327383 diff --git a/test/libsolidity/semanticTests/array/copying/array_of_structs_containing_arrays_memory_to_storage.sol b/test/libsolidity/semanticTests/array/copying/array_of_structs_containing_arrays_memory_to_storage.sol index e175dd87c75b..de7553c28206 100644 --- a/test/libsolidity/semanticTests/array/copying/array_of_structs_containing_arrays_memory_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/array_of_structs_containing_arrays_memory_to_storage.sol @@ -26,4 +26,4 @@ contract C { // compileViaYul: true // ---- // f() -> 3, 3, 3, 1 -// gas irOptimized: 181950 +// gas irOptimized: 181912 diff --git a/test/libsolidity/semanticTests/array/copying/array_storage_multi_items_per_slot.sol b/test/libsolidity/semanticTests/array/copying/array_storage_multi_items_per_slot.sol index e335d8684978..5c44ef16a54d 100644 --- a/test/libsolidity/semanticTests/array/copying/array_storage_multi_items_per_slot.sol +++ b/test/libsolidity/semanticTests/array/copying/array_storage_multi_items_per_slot.sol @@ -12,6 +12,6 @@ contract C { } // ---- // f() -> 1, 2, 3 -// gas irOptimized: 131932 +// gas irOptimized: 131915 // gas legacy: 134606 // gas legacyOptimized: 131938 diff --git a/test/libsolidity/semanticTests/array/copying/array_to_mapping.sol b/test/libsolidity/semanticTests/array/copying/array_to_mapping.sol index 9fcbbffcea46..540c6516fe05 100644 --- a/test/libsolidity/semanticTests/array/copying/array_to_mapping.sol +++ b/test/libsolidity/semanticTests/array/copying/array_to_mapping.sol @@ -37,8 +37,8 @@ contract C { } // ---- // from_storage() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 -// gas irOptimized: 147892 +// gas irOptimized: 147868 // gas legacy: 148896 -// gas legacyOptimized: 146908 +// gas legacyOptimized: 146901 // from_storage_ptr() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 // from_memory() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 diff --git a/test/libsolidity/semanticTests/array/copying/bytes_inside_mappings.sol b/test/libsolidity/semanticTests/array/copying/bytes_inside_mappings.sol index 523a0ebebb9e..c20d536e23ce 100644 --- a/test/libsolidity/semanticTests/array/copying/bytes_inside_mappings.sol +++ b/test/libsolidity/semanticTests/array/copying/bytes_inside_mappings.sol @@ -5,11 +5,11 @@ contract c { } // ---- // set(uint256): 1, 2 -> true -// gas irOptimized: 110574 +// gas irOptimized: 110558 // gas legacy: 111312 // gas legacyOptimized: 110744 // set(uint256): 2, 2, 3, 4, 5 -> true -// gas irOptimized: 177525 +// gas irOptimized: 177509 // gas legacy: 178314 // gas legacyOptimized: 177719 // storageEmpty -> 0 diff --git a/test/libsolidity/semanticTests/array/copying/bytes_storage_to_storage.sol b/test/libsolidity/semanticTests/array/copying/bytes_storage_to_storage.sol index 9448970b7845..5b96afb03a33 100644 --- a/test/libsolidity/semanticTests/array/copying/bytes_storage_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/bytes_storage_to_storage.sol @@ -17,25 +17,25 @@ contract c { // ---- // f(uint256): 0 -> 0x20, 0x00 // f(uint256): 31 -> 0x20, 0x1f, 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e00 -// gas irOptimized: 109255 +// gas irOptimized: 109794 // gas legacy: 123948 // gas legacyOptimized: 118948 // f(uint256): 32 -> 0x20, 0x20, 1780731860627700044960722568376592200742329637303199754547598369979440671 -// gas irOptimized: 123936 +// gas irOptimized: 124047 // gas legacy: 140362 // gas legacyOptimized: 135386 // f(uint256): 33 -> 0x20, 33, 1780731860627700044960722568376592200742329637303199754547598369979440671, 0x2000000000000000000000000000000000000000000000000000000000000000 -// gas irOptimized: 130543 +// gas irOptimized: 130663 // gas legacy: 147916 -// gas legacyOptimized: 142290 +// gas legacyOptimized: 142278 // f(uint256): 63 -> 0x20, 0x3f, 1780731860627700044960722568376592200742329637303199754547598369979440671, 14532552714582660066924456880521368950258152170031413196862950297402215316992 -// gas irOptimized: 139333 +// gas irOptimized: 139543 // gas legacy: 171136 -// gas legacyOptimized: 161550 +// gas legacyOptimized: 161538 // f(uint256): 12 -> 0x20, 0x0c, 0x0102030405060708090a0b0000000000000000000000000000000000000000 // gas legacy: 59345 // gas legacyOptimized: 57279 // f(uint256): 129 -> 0x20, 0x81, 1780731860627700044960722568376592200742329637303199754547598369979440671, 0x202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f, 29063324697304692433803953038474361308315562010425523193971352996434451193439, 0x606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f, -57896044618658097711785492504343953926634992332820282019728792003956564819968 -// gas irOptimized: 441985 +// gas irOptimized: 442419 // gas legacy: 505021 // gas legacyOptimized: 486997 diff --git a/test/libsolidity/semanticTests/array/copying/calldata_array_dynamic_to_storage.sol b/test/libsolidity/semanticTests/array/copying/calldata_array_dynamic_to_storage.sol index 3f629686f78a..2dfde7afa7c3 100644 --- a/test/libsolidity/semanticTests/array/copying/calldata_array_dynamic_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/calldata_array_dynamic_to_storage.sol @@ -9,6 +9,6 @@ contract C { } // ---- // f(uint256[]): 0x20, 0x03, 0x1, 0x2, 0x3 -> 0x1 -// gas irOptimized: 110970 +// gas irOptimized: 110962 // gas legacy: 111551 // gas legacyOptimized: 111339 diff --git a/test/libsolidity/semanticTests/array/copying/calldata_array_to_mapping.sol b/test/libsolidity/semanticTests/array/copying/calldata_array_to_mapping.sol index 26f3d587f0c0..64b8cd9308d3 100644 --- a/test/libsolidity/semanticTests/array/copying/calldata_array_to_mapping.sol +++ b/test/libsolidity/semanticTests/array/copying/calldata_array_to_mapping.sol @@ -14,4 +14,4 @@ contract C { // compileViaYul: true // ---- // from_calldata(uint8[][]): 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 -// gas irOptimized: 139905 +// gas irOptimized: 139685 diff --git a/test/libsolidity/semanticTests/array/copying/cleanup_during_multi_element_per_slot_copy.sol b/test/libsolidity/semanticTests/array/copying/cleanup_during_multi_element_per_slot_copy.sol index 9a111e2bcde3..d2361dac5462 100644 --- a/test/libsolidity/semanticTests/array/copying/cleanup_during_multi_element_per_slot_copy.sol +++ b/test/libsolidity/semanticTests/array/copying/cleanup_during_multi_element_per_slot_copy.sol @@ -16,7 +16,7 @@ contract C { } // ---- // constructor() -// gas irOptimized: 234419 +// gas irOptimized: 226349 // gas legacy: 215757 // gas legacyOptimized: 181760 // f() -> 0 diff --git a/test/libsolidity/semanticTests/array/copying/copy_byte_array_in_struct_to_storage.sol b/test/libsolidity/semanticTests/array/copying/copy_byte_array_in_struct_to_storage.sol index edb657ad975b..cc2344cea9b4 100644 --- a/test/libsolidity/semanticTests/array/copying/copy_byte_array_in_struct_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/copy_byte_array_in_struct_to_storage.sol @@ -35,12 +35,12 @@ contract C { } // ---- // f() -> 0x40, 0x80, 6, 0x6162636465660000000000000000000000000000000000000000000000000000, 0x49, 0x3132333435363738393031323334353637383930313233343536373839303120, 0x3132333435363738393031323334353637383930313233343536373839303120, 0x3132333435363738390000000000000000000000000000000000000000000000 -// gas irOptimized: 179752 +// gas irOptimized: 179737 // gas legacy: 181001 -// gas legacyOptimized: 180014 +// gas legacyOptimized: 180018 // g() -> 0x40, 0xc0, 0x49, 0x3132333435363738393031323334353637383930313233343536373839303120, 0x3132333435363738393031323334353637383930313233343536373839303120, 0x3132333435363738390000000000000000000000000000000000000000000000, 0x11, 0x3132333435363738393233343536373839000000000000000000000000000000 -// gas irOptimized: 106682 +// gas irOptimized: 106666 // gas legacy: 109720 -// gas legacyOptimized: 106937 +// gas legacyOptimized: 106932 // h() -> 0x40, 0x60, 0x00, 0x00 // storageEmpty -> 1 diff --git a/test/libsolidity/semanticTests/array/copying/copy_byte_array_to_storage.sol b/test/libsolidity/semanticTests/array/copying/copy_byte_array_to_storage.sol index 61d5ccf869dc..d4599cdb7e58 100644 --- a/test/libsolidity/semanticTests/array/copying/copy_byte_array_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/copy_byte_array_to_storage.sol @@ -46,6 +46,6 @@ contract C { } // ---- // f() -> 0xff -// gas irOptimized: 143426 +// gas irOptimized: 143412 // gas legacy: 153395 -// gas legacyOptimized: 146722 +// gas legacyOptimized: 146720 diff --git a/test/libsolidity/semanticTests/array/copying/copy_function_internal_storage_array.sol b/test/libsolidity/semanticTests/array/copying/copy_function_internal_storage_array.sol index 18795ff798c2..850803c13830 100644 --- a/test/libsolidity/semanticTests/array/copying/copy_function_internal_storage_array.sol +++ b/test/libsolidity/semanticTests/array/copying/copy_function_internal_storage_array.sol @@ -15,6 +15,6 @@ contract C { } // ---- // test() -> 7 -// gas irOptimized: 122477 +// gas irOptimized: 122454 // gas legacy: 205176 // gas legacyOptimized: 204971 diff --git a/test/libsolidity/semanticTests/array/copying/copy_removes_bytes_data.sol b/test/libsolidity/semanticTests/array/copying/copy_removes_bytes_data.sol index 58fc1c13dacf..752dd6494f4a 100644 --- a/test/libsolidity/semanticTests/array/copying/copy_removes_bytes_data.sol +++ b/test/libsolidity/semanticTests/array/copying/copy_removes_bytes_data.sol @@ -7,9 +7,9 @@ contract c { } // ---- // set(): 1, 2, 3, 4, 5 -> true -// gas irOptimized: 177383 +// gas irOptimized: 177375 // gas legacy: 177954 -// gas legacyOptimized: 177554 +// gas legacyOptimized: 177553 // storageEmpty -> 0 // reset() -> true // storageEmpty -> 1 diff --git a/test/libsolidity/semanticTests/array/copying/copying_bytes_multiassign.sol b/test/libsolidity/semanticTests/array/copying/copying_bytes_multiassign.sol index 8277df30a1e1..4bf021094e7c 100644 --- a/test/libsolidity/semanticTests/array/copying/copying_bytes_multiassign.sol +++ b/test/libsolidity/semanticTests/array/copying/copying_bytes_multiassign.sol @@ -18,9 +18,9 @@ contract sender { } // ---- // (): 7 -> -// gas irOptimized: 110820 +// gas irOptimized: 110831 // gas legacy: 111388 -// gas legacyOptimized: 111071 +// gas legacyOptimized: 111070 // val() -> 0 // forward(bool): true -> true // val() -> 0x80 diff --git a/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_calldata_to_storage.sol b/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_calldata_to_storage.sol index eb0eb108fbf9..1214a73dbf5b 100644 --- a/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_calldata_to_storage.sol @@ -31,8 +31,8 @@ contract C { // compileViaYul: true // ---- // test1((uint8[],uint8[2])[][][]): 0x20, 1, 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -> 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -// gas irOptimized: 327821 +// gas irOptimized: 327844 // test2((uint8[],uint8[2])[][1][]): 0x20, 2, 0x40, 0x0160, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13, 0x20, 1, 0x20, 0x60, 31, 37, 2, 23, 29 -> 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 -// gas irOptimized: 140867 +// gas irOptimized: 140870 // test3((uint8[],uint8[2])[1][][2]): 0x20, 0x40, 0x60, 0, 2, 0x40, 288, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 2, 0x40, 288, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -// gas irOptimized: 188473 +// gas irOptimized: 188515 diff --git a/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_memory_to_storage.sol b/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_memory_to_storage.sol index 9dbc64f734a9..b3eda2122387 100644 --- a/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_memory_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_memory_to_storage.sol @@ -31,8 +31,8 @@ contract C { // compileViaYul: true // ---- // test1((uint8[],uint8[2])[][][]): 0x20, 1, 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -> 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -// gas irOptimized: 332527 +// gas irOptimized: 332687 // test2((uint8[],uint8[2])[][1][]): 0x20, 2, 0x40, 0x0160, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13, 0x20, 1, 0x20, 0x60, 31, 37, 2, 23, 29 -> 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 -// gas irOptimized: 145155 +// gas irOptimized: 145161 // test3((uint8[],uint8[2])[1][][2]): 0x20, 0x40, 0x60, 0, 2, 0x40, 288, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 2, 0x40, 288, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -// gas irOptimized: 192476 +// gas irOptimized: 192608 diff --git a/test/libsolidity/semanticTests/array/copying/function_type_array_to_storage.sol b/test/libsolidity/semanticTests/array/copying/function_type_array_to_storage.sol index 68db47519436..53455e9eb51e 100644 --- a/test/libsolidity/semanticTests/array/copying/function_type_array_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/function_type_array_to_storage.sol @@ -46,7 +46,7 @@ contract C { } // ---- // test() -> 0x20, 0x14, "[a called][b called]" -// gas irOptimized: 116638 +// gas irOptimized: 116631 // gas legacy: 118936 // gas legacyOptimized: 116975 // test2() -> 0x20, 0x14, "[b called][a called]" diff --git a/test/libsolidity/semanticTests/array/copying/memory_dyn_2d_bytes_to_storage.sol b/test/libsolidity/semanticTests/array/copying/memory_dyn_2d_bytes_to_storage.sol index 074ca934ff13..f659c28d6218 100644 --- a/test/libsolidity/semanticTests/array/copying/memory_dyn_2d_bytes_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/memory_dyn_2d_bytes_to_storage.sol @@ -18,6 +18,6 @@ contract C { } // ---- // f() -> 3 -// gas irOptimized: 128116 +// gas irOptimized: 128273 // gas legacy: 130584 -// gas legacyOptimized: 129031 +// gas legacyOptimized: 129028 diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_storage.sol index c962d815f434..ad8cbbb2a7a5 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_storage.sol @@ -70,15 +70,15 @@ contract C { } // ---- // test1() -> -// gas irOptimized: 150508 +// gas irOptimized: 150460 // gas legacy: 150949 // gas legacyOptimized: 150906 // test2() -> FAILURE -// gas irOptimized: 150385 +// gas irOptimized: 150378 // gas legacy: 150673 // gas legacyOptimized: 150576 // test3() -> -// gas irOptimized: 123776 +// gas irOptimized: 123762 // gas legacy: 125333 // gas legacyOptimized: 125127 // test4() -> FAILURE diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol index fe60365e4aa7..52dcb2565910 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol @@ -29,8 +29,8 @@ contract C { // compileViaYul: true // ---- // test1((uint8[],uint8[2])[][]): 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -> 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -// gas irOptimized: 304714 +// gas irOptimized: 304751 // test2((uint8[],uint8[2])[][1]): 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 -// gas irOptimized: 116454 +// gas irOptimized: 116449 // test3((uint8[],uint8[2])[1][]): 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -// gas irOptimized: 187962 +// gas irOptimized: 188004 diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_storage.sol index ccf2f2a2082d..48513d001927 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_storage.sol @@ -29,8 +29,8 @@ contract C { // compileViaYul: true // ---- // test1((uint8[],uint8[2])[][]): 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -> 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -// gas irOptimized: 309068 +// gas irOptimized: 309071 // test2((uint8[],uint8[2])[][1]): 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 -// gas irOptimized: 118167 +// gas irOptimized: 118264 // test3((uint8[],uint8[2])[1][]): 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -// gas irOptimized: 190961 +// gas irOptimized: 191003 diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_storage_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_storage_to_storage.sol index fb06b318874a..be2e2447e364 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_storage_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_storage_to_storage.sol @@ -63,7 +63,7 @@ contract C { // compileViaYul: true // ---- // test1() -// gas irOptimized: 123237 +// gas irOptimized: 123202 // test2() -// gas irOptimized: 123043 +// gas irOptimized: 123030 // test3() diff --git a/test/libsolidity/semanticTests/array/copying/nested_dynamic_array_element_calldata_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_dynamic_array_element_calldata_to_storage.sol index 6e44ed2686ab..c32f7bf6b097 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_dynamic_array_element_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_dynamic_array_element_calldata_to_storage.sol @@ -30,7 +30,7 @@ contract C { // compileViaYul: true // ---- // test(uint8[][][]): 0x20, 2, 0x40, 0x60, 0, 2, 0x40, 0x80, 1, 7, 2, 8, 9 -// gas irOptimized: 138054 +// gas irOptimized: 138040 // test2(uint8[][]): 0x20, 2, 0x40, 0x80, 1, 7, 2, 8, 9 -// gas irOptimized: 164232 +// gas irOptimized: 164248 // gas legacyOptimized: 120228 diff --git a/test/libsolidity/semanticTests/array/copying/storage_memory_nested.sol b/test/libsolidity/semanticTests/array/copying/storage_memory_nested.sol index f7a863b46953..f6079f1a838f 100644 --- a/test/libsolidity/semanticTests/array/copying/storage_memory_nested.sol +++ b/test/libsolidity/semanticTests/array/copying/storage_memory_nested.sol @@ -17,6 +17,6 @@ contract C { } // ---- // f() -> 1, 2, 3, 4, 5, 6, 7 -// gas irOptimized: 205974 +// gas irOptimized: 205881 // gas legacy: 212237 // gas legacyOptimized: 211425 diff --git a/test/libsolidity/semanticTests/array/copying/storage_memory_nested_bytes.sol b/test/libsolidity/semanticTests/array/copying/storage_memory_nested_bytes.sol index 2a786301585f..5bbff52fb675 100644 --- a/test/libsolidity/semanticTests/array/copying/storage_memory_nested_bytes.sol +++ b/test/libsolidity/semanticTests/array/copying/storage_memory_nested_bytes.sol @@ -11,6 +11,6 @@ contract C { } // ---- // f() -> 0x20, 0x02, 0x40, 0x80, 3, 0x6162630000000000000000000000000000000000000000000000000000000000, 0x99, 44048183304486788312148433451363384677562265908331949128489393215789685032262, 32241931068525137014058842823026578386641954854143559838526554899205067598957, 49951309422467613961193228765530489307475214998374779756599339590522149884499, 0x54555658595a6162636465666768696a6b6c6d6e6f707172737475767778797a, 0x4142434445464748494a4b4c4d4e4f5051525354555658595a00000000000000 -// gas irOptimized: 202805 +// gas irOptimized: 202738 // gas legacy: 204798 -// gas legacyOptimized: 203368 +// gas legacyOptimized: 203357 diff --git a/test/libsolidity/semanticTests/array/copying/storage_memory_nested_from_pointer.sol b/test/libsolidity/semanticTests/array/copying/storage_memory_nested_from_pointer.sol index 0f3f7783d478..ce4e31769dad 100644 --- a/test/libsolidity/semanticTests/array/copying/storage_memory_nested_from_pointer.sol +++ b/test/libsolidity/semanticTests/array/copying/storage_memory_nested_from_pointer.sol @@ -18,6 +18,6 @@ contract C { } // ---- // f() -> 1, 2, 3, 4, 5, 6, 7 -// gas irOptimized: 205974 +// gas irOptimized: 205881 // gas legacy: 212242 // gas legacyOptimized: 211430 diff --git a/test/libsolidity/semanticTests/array/copying/storage_memory_nested_struct.sol b/test/libsolidity/semanticTests/array/copying/storage_memory_nested_struct.sol index b40bfacedc7a..cfbf5c874575 100644 --- a/test/libsolidity/semanticTests/array/copying/storage_memory_nested_struct.sol +++ b/test/libsolidity/semanticTests/array/copying/storage_memory_nested_struct.sol @@ -24,6 +24,6 @@ contract C { } // ---- // f() -> 11, 0x0c, 1, 0x15, 22, 4 -// gas irOptimized: 291155 +// gas irOptimized: 291047 // gas legacy: 293407 // gas legacyOptimized: 290218 diff --git a/test/libsolidity/semanticTests/array/copying/storage_memory_packed_dyn.sol b/test/libsolidity/semanticTests/array/copying/storage_memory_packed_dyn.sol index 341a4c9d9029..bfda8d7affbb 100644 --- a/test/libsolidity/semanticTests/array/copying/storage_memory_packed_dyn.sol +++ b/test/libsolidity/semanticTests/array/copying/storage_memory_packed_dyn.sol @@ -13,6 +13,6 @@ contract C { } // ---- // f() -> 2, 3, 4 -// gas irOptimized: 109804 +// gas irOptimized: 109698 // gas legacy: 126129 // gas legacyOptimized: 120622 diff --git a/test/libsolidity/semanticTests/array/create_memory_array.sol b/test/libsolidity/semanticTests/array/create_memory_array.sol index 0d099815bf34..ecfecb9c0c20 100644 --- a/test/libsolidity/semanticTests/array/create_memory_array.sol +++ b/test/libsolidity/semanticTests/array/create_memory_array.sol @@ -18,6 +18,6 @@ contract C { } // ---- // f() -> "A", 8, 4, "B" -// gas irOptimized: 125827 +// gas irOptimized: 125819 // gas legacy: 121382 // gas legacyOptimized: 115488 diff --git a/test/libsolidity/semanticTests/array/delete/bytes_delete_element.sol b/test/libsolidity/semanticTests/array/delete/bytes_delete_element.sol index a653db837f08..583f6af17f07 100644 --- a/test/libsolidity/semanticTests/array/delete/bytes_delete_element.sol +++ b/test/libsolidity/semanticTests/array/delete/bytes_delete_element.sol @@ -16,6 +16,6 @@ contract c { } // ---- // test1() -> true -// gas irOptimized: 206322 +// gas irOptimized: 206086 // gas legacy: 254056 -// gas legacyOptimized: 246887 +// gas legacyOptimized: 246892 diff --git a/test/libsolidity/semanticTests/array/dynamic_array_cleanup.sol b/test/libsolidity/semanticTests/array/dynamic_array_cleanup.sol index 13d510f80b2a..a04ea013a87c 100644 --- a/test/libsolidity/semanticTests/array/dynamic_array_cleanup.sol +++ b/test/libsolidity/semanticTests/array/dynamic_array_cleanup.sol @@ -14,7 +14,7 @@ contract c { // ---- // storageEmpty -> 1 // fill() -> -// gas irOptimized: 519276 +// gas irOptimized: 519266 // gas legacy: 521414 // gas legacyOptimized: 516983 // storageEmpty -> 0 diff --git a/test/libsolidity/semanticTests/array/dynamic_arrays_in_storage.sol b/test/libsolidity/semanticTests/array/dynamic_arrays_in_storage.sol index bce78baa4133..2f6769a24189 100644 --- a/test/libsolidity/semanticTests/array/dynamic_arrays_in_storage.sol +++ b/test/libsolidity/semanticTests/array/dynamic_arrays_in_storage.sol @@ -41,7 +41,7 @@ contract c { // ---- // getLengths() -> 0, 0 // setLengths(uint256,uint256): 48, 49 -> -// gas irOptimized: 111301 +// gas irOptimized: 110797 // gas legacy: 108273 // gas legacyOptimized: 100269 // getLengths() -> 48, 49 diff --git a/test/libsolidity/semanticTests/array/dynamic_multi_array_cleanup.sol b/test/libsolidity/semanticTests/array/dynamic_multi_array_cleanup.sol index 4c5f646951b9..7621d05bdcfd 100644 --- a/test/libsolidity/semanticTests/array/dynamic_multi_array_cleanup.sol +++ b/test/libsolidity/semanticTests/array/dynamic_multi_array_cleanup.sol @@ -16,7 +16,7 @@ contract c { // ---- // storageEmpty -> 1 // fill() -> 8 -// gas irOptimized: 122916 +// gas irOptimized: 122742 // gas legacy: 121602 // gas legacyOptimized: 120589 // storageEmpty -> 0 diff --git a/test/libsolidity/semanticTests/array/fixed_array_cleanup.sol b/test/libsolidity/semanticTests/array/fixed_array_cleanup.sol index 337946a20c90..a354cf8042c1 100644 --- a/test/libsolidity/semanticTests/array/fixed_array_cleanup.sol +++ b/test/libsolidity/semanticTests/array/fixed_array_cleanup.sol @@ -10,7 +10,7 @@ contract c { // ---- // storageEmpty -> 1 // fill() -> -// gas irOptimized: 465324 +// gas irOptimized: 465314 // gas legacy: 471178 // gas legacyOptimized: 467478 // storageEmpty -> 0 diff --git a/test/libsolidity/semanticTests/array/fixed_arrays_as_return_type.sol b/test/libsolidity/semanticTests/array/fixed_arrays_as_return_type.sol index 9d8dc0bc7b52..79c0f8fbfd12 100644 --- a/test/libsolidity/semanticTests/array/fixed_arrays_as_return_type.sol +++ b/test/libsolidity/semanticTests/array/fixed_arrays_as_return_type.sol @@ -18,6 +18,6 @@ contract B { } // ---- // f() -> 2, 3, 4, 5, 6, 1000, 1001, 1002, 1003, 1004 -// gas irOptimized: 115828 +// gas irOptimized: 114204 // gas legacy: 230001 // gas legacyOptimized: 130637 diff --git a/test/libsolidity/semanticTests/array/fixed_arrays_in_constructors.sol b/test/libsolidity/semanticTests/array/fixed_arrays_in_constructors.sol index 71fec7bda0d1..ac11d779a563 100644 --- a/test/libsolidity/semanticTests/array/fixed_arrays_in_constructors.sol +++ b/test/libsolidity/semanticTests/array/fixed_arrays_in_constructors.sol @@ -9,7 +9,7 @@ contract Creator { } // ---- // constructor(): 1, 2, 3, 4 -> -// gas irOptimized: 127659 +// gas irOptimized: 126363 // gas legacy: 174186 // gas legacyOptimized: 128709 // r() -> 4 diff --git a/test/libsolidity/semanticTests/array/function_array_cross_calls.sol b/test/libsolidity/semanticTests/array/function_array_cross_calls.sol index 7e29d82a8166..a2bc2ff9005e 100644 --- a/test/libsolidity/semanticTests/array/function_array_cross_calls.sol +++ b/test/libsolidity/semanticTests/array/function_array_cross_calls.sol @@ -42,6 +42,6 @@ contract C { } // ---- // test() -> 5, 6, 7 -// gas irOptimized: 260895 +// gas irOptimized: 256074 // gas legacy: 441556 // gas legacyOptimized: 279321 diff --git a/test/libsolidity/semanticTests/array/invalid_encoding_for_storage_byte_array.sol b/test/libsolidity/semanticTests/array/invalid_encoding_for_storage_byte_array.sol index 815c1768c2db..4d8422ecdf86 100644 --- a/test/libsolidity/semanticTests/array/invalid_encoding_for_storage_byte_array.sol +++ b/test/libsolidity/semanticTests/array/invalid_encoding_for_storage_byte_array.sol @@ -40,7 +40,7 @@ contract C { // copyFromStorageShort() // x() -> 0x20, 3, 0x6162630000000000000000000000000000000000000000000000000000000000 // copyFromStorageLong() -// gas irOptimized: 121123 +// gas irOptimized: 121104 // gas legacy: 121904 // gas legacyOptimized: 121400 // x() -> 0x20, 0x25, 0x3132333435363738393031323334353637383930313233343536373839303132, 0x3334353637000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/array/pop/array_pop_array_transition.sol b/test/libsolidity/semanticTests/array/pop/array_pop_array_transition.sol index 7f80f1bd0770..a08d27ac0b38 100644 --- a/test/libsolidity/semanticTests/array/pop/array_pop_array_transition.sol +++ b/test/libsolidity/semanticTests/array/pop/array_pop_array_transition.sol @@ -23,7 +23,7 @@ contract c { } // ---- // test() -> 1, 2, 3 -// gas irOptimized: 1828169 +// gas irOptimized: 1827730 // gas legacy: 1822466 // gas legacyOptimized: 1813404 // storageEmpty -> 1 diff --git a/test/libsolidity/semanticTests/array/pop/array_pop_uint16_transition.sol b/test/libsolidity/semanticTests/array/pop/array_pop_uint16_transition.sol index 6a657032bb48..93e1512bc445 100644 --- a/test/libsolidity/semanticTests/array/pop/array_pop_uint16_transition.sol +++ b/test/libsolidity/semanticTests/array/pop/array_pop_uint16_transition.sol @@ -18,7 +18,7 @@ contract c { } // ---- // test() -> 38, 28, 18 -// gas irOptimized: 148168 +// gas irOptimized: 148087 // gas legacy: 151184 // gas legacyOptimized: 142418 // storageEmpty -> 1 diff --git a/test/libsolidity/semanticTests/array/pop/array_pop_uint24_transition.sol b/test/libsolidity/semanticTests/array/pop/array_pop_uint24_transition.sol index 1a74ea972295..c28e1b91c597 100644 --- a/test/libsolidity/semanticTests/array/pop/array_pop_uint24_transition.sol +++ b/test/libsolidity/semanticTests/array/pop/array_pop_uint24_transition.sol @@ -18,7 +18,7 @@ contract c { } // ---- // test() -> 20, 10 -// gas irOptimized: 125933 +// gas irOptimized: 126072 // gas legacy: 127216 // gas legacyOptimized: 122224 // storageEmpty -> 1 diff --git a/test/libsolidity/semanticTests/array/pop/byte_array_pop_long_storage_empty.sol b/test/libsolidity/semanticTests/array/pop/byte_array_pop_long_storage_empty.sol index 95a2b012c713..68e52a195913 100644 --- a/test/libsolidity/semanticTests/array/pop/byte_array_pop_long_storage_empty.sol +++ b/test/libsolidity/semanticTests/array/pop/byte_array_pop_long_storage_empty.sol @@ -16,7 +16,7 @@ contract c { } // ---- // test() -> true -// gas irOptimized: 140325 +// gas irOptimized: 140056 // gas legacy: 178397 // gas legacyOptimized: 163832 // storageEmpty -> 1 diff --git a/test/libsolidity/semanticTests/array/pop/byte_array_pop_long_storage_empty_garbage_ref.sol b/test/libsolidity/semanticTests/array/pop/byte_array_pop_long_storage_empty_garbage_ref.sol index f6eb8e1270c2..a014e761ea24 100644 --- a/test/libsolidity/semanticTests/array/pop/byte_array_pop_long_storage_empty_garbage_ref.sol +++ b/test/libsolidity/semanticTests/array/pop/byte_array_pop_long_storage_empty_garbage_ref.sol @@ -15,7 +15,7 @@ contract c { } // ---- // test() -> -// gas irOptimized: 113826 +// gas irOptimized: 113782 // gas legacy: 131245 // gas legacyOptimized: 126668 // storageEmpty -> 1 diff --git a/test/libsolidity/semanticTests/array/pop/byte_array_pop_masking_long.sol b/test/libsolidity/semanticTests/array/pop/byte_array_pop_masking_long.sol index 623b58739a11..e4e0b0b0ddd1 100644 --- a/test/libsolidity/semanticTests/array/pop/byte_array_pop_masking_long.sol +++ b/test/libsolidity/semanticTests/array/pop/byte_array_pop_masking_long.sol @@ -9,6 +9,6 @@ contract c { } // ---- // test() -> 0x20, 33, 0x303030303030303030303030303030303030303030303030303030303030303, 0x0300000000000000000000000000000000000000000000000000000000000000 -// gas irOptimized: 108053 +// gas irOptimized: 107969 // gas legacy: 125420 // gas legacyOptimized: 122472 diff --git a/test/libsolidity/semanticTests/array/push/array_push.sol b/test/libsolidity/semanticTests/array/push/array_push.sol index 0dbd7c11bfaf..3e7ceb5a8b7d 100644 --- a/test/libsolidity/semanticTests/array/push/array_push.sol +++ b/test/libsolidity/semanticTests/array/push/array_push.sol @@ -16,6 +16,6 @@ contract c { } // ---- // test() -> 5, 4, 3, 3 -// gas irOptimized: 111401 +// gas irOptimized: 111363 // gas legacy: 111807 // gas legacyOptimized: 111122 diff --git a/test/libsolidity/semanticTests/array/push/array_push_nested_from_calldata.sol b/test/libsolidity/semanticTests/array/push/array_push_nested_from_calldata.sol index 87616f1f5fc3..66af798b9c44 100644 --- a/test/libsolidity/semanticTests/array/push/array_push_nested_from_calldata.sol +++ b/test/libsolidity/semanticTests/array/push/array_push_nested_from_calldata.sol @@ -12,6 +12,6 @@ contract C { } // ---- // f(uint120[]): 0x20, 3, 1, 2, 3 -> 1 -// gas irOptimized: 112825 +// gas irOptimized: 112813 // gas legacy: 113659 // gas legacyOptimized: 113482 diff --git a/test/libsolidity/semanticTests/array/push/array_push_struct.sol b/test/libsolidity/semanticTests/array/push/array_push_struct.sol index f7918bbb488f..bc09edeb5f49 100644 --- a/test/libsolidity/semanticTests/array/push/array_push_struct.sol +++ b/test/libsolidity/semanticTests/array/push/array_push_struct.sol @@ -20,6 +20,6 @@ contract c { } // ---- // test() -> 2, 3, 4, 5 -// gas irOptimized: 135199 +// gas irOptimized: 135082 // gas legacy: 147443 // gas legacyOptimized: 146434 diff --git a/test/libsolidity/semanticTests/array/push/array_push_struct_from_calldata.sol b/test/libsolidity/semanticTests/array/push/array_push_struct_from_calldata.sol index 91a6a0b372cc..bce81a868065 100644 --- a/test/libsolidity/semanticTests/array/push/array_push_struct_from_calldata.sol +++ b/test/libsolidity/semanticTests/array/push/array_push_struct_from_calldata.sol @@ -16,6 +16,6 @@ contract c { } // ---- // test((uint16,uint16,uint16[3],uint16[])): 0x20, 2, 3, 0, 0, 4, 0xC0, 4, 0, 0, 5, 0, 0 -> 2, 3, 4, 5 -// gas irOptimized: 137087 +// gas irOptimized: 137031 // gas legacy: 142423 // gas legacyOptimized: 137993 diff --git a/test/libsolidity/semanticTests/array/push/byte_array_push_transition.sol b/test/libsolidity/semanticTests/array/push/byte_array_push_transition.sol index 08cfe58a3f60..3b49b22d7821 100644 --- a/test/libsolidity/semanticTests/array/push/byte_array_push_transition.sol +++ b/test/libsolidity/semanticTests/array/push/byte_array_push_transition.sol @@ -15,6 +15,6 @@ contract c { } // ---- // test() -> 0 -// gas irOptimized: 173252 +// gas irOptimized: 172113 // gas legacy: 215891 // gas legacyOptimized: 203615 diff --git a/test/libsolidity/semanticTests/array/push/nested_bytes_push.sol b/test/libsolidity/semanticTests/array/push/nested_bytes_push.sol index b2fbbc977bfd..a21e1ba21fb1 100644 --- a/test/libsolidity/semanticTests/array/push/nested_bytes_push.sol +++ b/test/libsolidity/semanticTests/array/push/nested_bytes_push.sol @@ -13,6 +13,6 @@ contract C { } // ---- // f() -> -// gas irOptimized: 179165 +// gas irOptimized: 179110 // gas legacy: 181014 -// gas legacyOptimized: 180413 +// gas legacyOptimized: 180422 diff --git a/test/libsolidity/semanticTests/array/push/push_no_args_2d.sol b/test/libsolidity/semanticTests/array/push/push_no_args_2d.sol index 4b5a2b89d730..6901e32b8b54 100644 --- a/test/libsolidity/semanticTests/array/push/push_no_args_2d.sol +++ b/test/libsolidity/semanticTests/array/push/push_no_args_2d.sol @@ -27,14 +27,14 @@ contract C { // ---- // l() -> 0 // f(uint256,uint256): 42, 64 -> -// gas irOptimized: 112290 +// gas irOptimized: 112266 // gas legacy: 107920 // gas legacyOptimized: 101897 // l() -> 1 // ll(uint256): 0 -> 43 // a(uint256,uint256): 0, 42 -> 64 // f(uint256,uint256): 84, 128 -> -// gas irOptimized: 118710 +// gas irOptimized: 118686 // gas legacy: 109972 // gas legacyOptimized: 96331 // l() -> 2 diff --git a/test/libsolidity/semanticTests/array/push/push_no_args_bytes.sol b/test/libsolidity/semanticTests/array/push/push_no_args_bytes.sol index 8ba57af0208f..6a2b70153a22 100644 --- a/test/libsolidity/semanticTests/array/push/push_no_args_bytes.sol +++ b/test/libsolidity/semanticTests/array/push/push_no_args_bytes.sol @@ -21,7 +21,7 @@ contract C { // ---- // l() -> 0 // g(uint256): 70 -> -// gas irOptimized: 182362 +// gas irOptimized: 182497 // gas legacy: 183445 // gas legacyOptimized: 178995 // l() -> 70 diff --git a/test/libsolidity/semanticTests/array/reusing_memory.sol b/test/libsolidity/semanticTests/array/reusing_memory.sol index b690fad1de4c..92b0c06bfb26 100644 --- a/test/libsolidity/semanticTests/array/reusing_memory.sol +++ b/test/libsolidity/semanticTests/array/reusing_memory.sol @@ -24,6 +24,6 @@ contract Main { } // ---- // f(uint256): 0x34 -> 0x46bddb1178e94d7f2892ff5f366840eb658911794f2c3a44c450aa2c505186c1 -// gas irOptimized: 112161 +// gas irOptimized: 111924 // gas legacy: 125162 // gas legacyOptimized: 113012 diff --git a/test/libsolidity/semanticTests/byte_array_to_storage_cleanup.sol b/test/libsolidity/semanticTests/byte_array_to_storage_cleanup.sol index d76260c9ab0b..c09528d2ba66 100644 --- a/test/libsolidity/semanticTests/byte_array_to_storage_cleanup.sol +++ b/test/libsolidity/semanticTests/byte_array_to_storage_cleanup.sol @@ -28,9 +28,9 @@ contract C { // compileViaYul: also // ---- // constructor() -> -// gas irOptimized: 442746 +// gas irOptimized: 439080 // gas legacy: 711299 -// gas legacyOptimized: 481080 +// gas legacyOptimized: 481296 // h() -> 0x20, 0x40, 0x00, 0 // ~ emit ev(uint256[],uint256): 0x40, 0x21, 0x02, 0x00, 0x00 // g() -> 0x20, 0x40, 0, 0x00 diff --git a/test/libsolidity/semanticTests/calldata/copy_from_calldata_removes_bytes_data.sol b/test/libsolidity/semanticTests/calldata/copy_from_calldata_removes_bytes_data.sol index 3dd93c12e42c..c87f6bfcff23 100644 --- a/test/libsolidity/semanticTests/calldata/copy_from_calldata_removes_bytes_data.sol +++ b/test/libsolidity/semanticTests/calldata/copy_from_calldata_removes_bytes_data.sol @@ -9,9 +9,9 @@ contract c { // EVMVersion: >=byzantium // ---- // (): 1, 2, 3, 4, 5 -> -// gas irOptimized: 155155 +// gas irOptimized: 155131 // gas legacy: 155473 -// gas legacyOptimized: 155299 +// gas legacyOptimized: 155298 // checkIfDataIsEmpty() -> false // sendMessage() -> true, 0x40, 0 // checkIfDataIsEmpty() -> true diff --git a/test/libsolidity/semanticTests/constructor/arrays_in_constructors.sol b/test/libsolidity/semanticTests/constructor/arrays_in_constructors.sol index 24c33facb62d..2bfab4fe6cd3 100644 --- a/test/libsolidity/semanticTests/constructor/arrays_in_constructors.sol +++ b/test/libsolidity/semanticTests/constructor/arrays_in_constructors.sol @@ -24,6 +24,6 @@ contract Creator { } // ---- // f(uint256,address[]): 7, 0x40, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 -> 7, 8 -// gas irOptimized: 429160 +// gas irOptimized: 424511 // gas legacy: 581443 // gas legacyOptimized: 444588 diff --git a/test/libsolidity/semanticTests/constructor/bytes_in_constructors_packer.sol b/test/libsolidity/semanticTests/constructor/bytes_in_constructors_packer.sol index 3df201222e3f..b4d5dd880f05 100644 --- a/test/libsolidity/semanticTests/constructor/bytes_in_constructors_packer.sol +++ b/test/libsolidity/semanticTests/constructor/bytes_in_constructors_packer.sol @@ -24,6 +24,6 @@ contract Creator { } // ---- // f(uint256,bytes): 7, 0x40, 78, "abcdefghijklmnopqrstuvwxyzabcdef", "ghijklmnopqrstuvwxyzabcdefghijkl", "mnopqrstuvwxyz" -> 7, "h" -// gas irOptimized: 278528 +// gas irOptimized: 275287 // gas legacy: 418462 -// gas legacyOptimized: 291755 +// gas legacyOptimized: 291760 diff --git a/test/libsolidity/semanticTests/constructor/bytes_in_constructors_unpacker.sol b/test/libsolidity/semanticTests/constructor/bytes_in_constructors_unpacker.sol index 99260d2efd81..b77793c0f15e 100644 --- a/test/libsolidity/semanticTests/constructor/bytes_in_constructors_unpacker.sol +++ b/test/libsolidity/semanticTests/constructor/bytes_in_constructors_unpacker.sol @@ -8,8 +8,8 @@ contract Test { } // ---- // constructor(): 7, 0x40, 78, "abcdefghijklmnopqrstuvwxyzabcdef", "ghijklmnopqrstuvwxyzabcdefghijkl", "mnopqrstuvwxyz" -> -// gas irOptimized: 269441 +// gas irOptimized: 268145 // gas legacy: 311324 -// gas legacyOptimized: 258351 +// gas legacyOptimized: 258388 // m_x() -> 7 // m_s() -> 0x20, 78, "abcdefghijklmnopqrstuvwxyzabcdef", "ghijklmnopqrstuvwxyzabcdefghijkl", "mnopqrstuvwxyz" diff --git a/test/libsolidity/semanticTests/constructor/constructor_arguments_external.sol b/test/libsolidity/semanticTests/constructor/constructor_arguments_external.sol index 4f8ebefeaa20..3037aaa31753 100644 --- a/test/libsolidity/semanticTests/constructor/constructor_arguments_external.sol +++ b/test/libsolidity/semanticTests/constructor/constructor_arguments_external.sol @@ -17,7 +17,7 @@ contract Main { } // ---- // constructor(): "abc", true -// gas irOptimized: 105906 +// gas irOptimized: 104394 // gas legacy: 143300 // gas legacyOptimized: 102961 // getFlag() -> true diff --git a/test/libsolidity/semanticTests/constructor/constructor_static_array_argument.sol b/test/libsolidity/semanticTests/constructor/constructor_static_array_argument.sol index dd91c86a2031..75fa809ed50d 100644 --- a/test/libsolidity/semanticTests/constructor/constructor_static_array_argument.sol +++ b/test/libsolidity/semanticTests/constructor/constructor_static_array_argument.sol @@ -9,7 +9,7 @@ contract C { } // ---- // constructor(): 1, 2, 3, 4 -> -// gas irOptimized: 172314 +// gas irOptimized: 171018 // gas legacy: 218378 // gas legacyOptimized: 176195 // a() -> 1 diff --git a/test/libsolidity/semanticTests/constructor/no_callvalue_check.sol b/test/libsolidity/semanticTests/constructor/no_callvalue_check.sol index 9319d592a549..eec01005ebd2 100644 --- a/test/libsolidity/semanticTests/constructor/no_callvalue_check.sol +++ b/test/libsolidity/semanticTests/constructor/no_callvalue_check.sol @@ -17,6 +17,6 @@ contract C { } // ---- // f(), 2000 ether -> true -// gas irOptimized: 119457 +// gas irOptimized: 119441 // gas legacy: 122621 // gas legacyOptimized: 122490 diff --git a/test/libsolidity/semanticTests/constructor_inheritance_init_order.sol b/test/libsolidity/semanticTests/constructor_inheritance_init_order.sol index 00dfef4abc99..20cd8760b9b9 100644 --- a/test/libsolidity/semanticTests/constructor_inheritance_init_order.sol +++ b/test/libsolidity/semanticTests/constructor_inheritance_init_order.sol @@ -14,5 +14,5 @@ contract B is A { // compileViaYul: true // ---- // constructor() -> -// gas irOptimized: 120936 +// gas irOptimized: 119640 // y() -> 42 diff --git a/test/libsolidity/semanticTests/constructor_inheritance_init_order_2.sol b/test/libsolidity/semanticTests/constructor_inheritance_init_order_2.sol index 9b982d6e9930..820c56a4eea2 100644 --- a/test/libsolidity/semanticTests/constructor_inheritance_init_order_2.sol +++ b/test/libsolidity/semanticTests/constructor_inheritance_init_order_2.sol @@ -9,7 +9,7 @@ contract B is A { } // ---- // constructor() -> -// gas irOptimized: 120936 +// gas irOptimized: 119640 // gas legacy: 133594 // gas legacyOptimized: 115341 // y() -> 42 diff --git a/test/libsolidity/semanticTests/constructor_with_params.sol b/test/libsolidity/semanticTests/constructor_with_params.sol index 13bdb625bf56..1916f692fd1a 100644 --- a/test/libsolidity/semanticTests/constructor_with_params.sol +++ b/test/libsolidity/semanticTests/constructor_with_params.sol @@ -9,7 +9,7 @@ contract C { } // ---- // constructor(): 2, 0 -> -// gas irOptimized: 102902 +// gas irOptimized: 101390 // gas legacy: 115678 // i() -> 2 // k() -> 0 diff --git a/test/libsolidity/semanticTests/constructor_with_params_diamond_inheritance.sol b/test/libsolidity/semanticTests/constructor_with_params_diamond_inheritance.sol index fc2dd8f7153c..b2f66e4500d8 100644 --- a/test/libsolidity/semanticTests/constructor_with_params_diamond_inheritance.sol +++ b/test/libsolidity/semanticTests/constructor_with_params_diamond_inheritance.sol @@ -21,7 +21,7 @@ contract D is B, C { } // ---- // constructor(): 2, 0 -> -// gas irOptimized: 153694 +// gas irOptimized: 151966 // gas legacy: 168623 // gas legacyOptimized: 144577 // i() -> 2 diff --git a/test/libsolidity/semanticTests/constructor_with_params_inheritance.sol b/test/libsolidity/semanticTests/constructor_with_params_inheritance.sol index a0b4c772d66e..f5b20d9816a0 100644 --- a/test/libsolidity/semanticTests/constructor_with_params_inheritance.sol +++ b/test/libsolidity/semanticTests/constructor_with_params_inheritance.sol @@ -12,7 +12,7 @@ contract D is C { } // ---- // constructor(): 2, 0 -> -// gas irOptimized: 123317 +// gas irOptimized: 121805 // gas legacy: 137193 // gas legacyOptimized: 118548 // i() -> 2 diff --git a/test/libsolidity/semanticTests/events/event_dynamic_array_storage.sol b/test/libsolidity/semanticTests/events/event_dynamic_array_storage.sol index 057496c6dd00..fec281c59a01 100644 --- a/test/libsolidity/semanticTests/events/event_dynamic_array_storage.sol +++ b/test/libsolidity/semanticTests/events/event_dynamic_array_storage.sol @@ -13,6 +13,6 @@ contract C { // ---- // createEvent(uint256): 42 -> // ~ emit E(uint256[]): 0x20, 0x03, 0x2a, 0x2b, 0x2c -// gas irOptimized: 113510 +// gas irOptimized: 113485 // gas legacy: 116314 // gas legacyOptimized: 114407 diff --git a/test/libsolidity/semanticTests/events/event_dynamic_array_storage_v2.sol b/test/libsolidity/semanticTests/events/event_dynamic_array_storage_v2.sol index 5c5138742a6d..2b5a7114d99b 100644 --- a/test/libsolidity/semanticTests/events/event_dynamic_array_storage_v2.sol +++ b/test/libsolidity/semanticTests/events/event_dynamic_array_storage_v2.sol @@ -14,6 +14,6 @@ contract C { // ---- // createEvent(uint256): 42 -> // ~ emit E(uint256[]): 0x20, 0x03, 0x2a, 0x2b, 0x2c -// gas irOptimized: 113510 +// gas irOptimized: 113485 // gas legacy: 116314 // gas legacyOptimized: 114407 diff --git a/test/libsolidity/semanticTests/events/event_dynamic_nested_array_storage_v2.sol b/test/libsolidity/semanticTests/events/event_dynamic_nested_array_storage_v2.sol index 7b9a9400be40..d6cfb68beff9 100644 --- a/test/libsolidity/semanticTests/events/event_dynamic_nested_array_storage_v2.sol +++ b/test/libsolidity/semanticTests/events/event_dynamic_nested_array_storage_v2.sol @@ -15,6 +15,6 @@ contract C { // ---- // createEvent(uint256): 42 -> // ~ emit E(uint256[][]): 0x20, 0x02, 0x40, 0xa0, 0x02, 0x2a, 0x2b, 0x02, 0x2c, 0x2d -// gas irOptimized: 185095 +// gas irOptimized: 185033 // gas legacy: 187495 -// gas legacyOptimized: 184534 +// gas legacyOptimized: 184525 diff --git a/test/libsolidity/semanticTests/events/event_indexed_string.sol b/test/libsolidity/semanticTests/events/event_indexed_string.sol index a6283f274ea1..dfd9dd3993c9 100644 --- a/test/libsolidity/semanticTests/events/event_indexed_string.sol +++ b/test/libsolidity/semanticTests/events/event_indexed_string.sol @@ -17,6 +17,6 @@ contract C { // ---- // deposit() -> // ~ emit E(string,uint256[4]): #0xa7fb06bb999a5eb9aff9e0779953f4e1e4ce58044936c2f51c7fb879b85c08bd, #0xe755d8cc1a8cde16a2a31160dcd8017ac32d7e2f13215b29a23cdae40a78aa81 -// gas irOptimized: 332157 +// gas irOptimized: 330920 // gas legacy: 387608 // gas legacyOptimized: 373772 diff --git a/test/libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol b/test/libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol index f2ee4894f167..f9f53275bba9 100644 --- a/test/libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol +++ b/test/libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol @@ -74,7 +74,7 @@ contract FixedFeeRegistrar is Registrar { } // ---- // constructor() -// gas irOptimized: 413501 +// gas irOptimized: 384610 // gas legacy: 913421 // gas legacyOptimized: 476928 // reserve(string), 69 ether: 0x20, 3, "abc" -> diff --git a/test/libsolidity/semanticTests/externalContracts/base64.sol b/test/libsolidity/semanticTests/externalContracts/base64.sol index 328b55ec9961..fd7288c8ff19 100644 --- a/test/libsolidity/semanticTests/externalContracts/base64.sol +++ b/test/libsolidity/semanticTests/externalContracts/base64.sol @@ -33,7 +33,7 @@ contract test { // EVMVersion: >=constantinople // ---- // constructor() -// gas irOptimized: 409367 +// gas irOptimized: 406907 // gas legacy: 737652 // gas legacyOptimized: 526820 // encode_inline_asm(bytes): 0x20, 0 -> 0x20, 0 @@ -51,10 +51,10 @@ contract test { // encode_no_asm(bytes): 0x20, 5, "fooba" -> 0x20, 8, "Zm9vYmE=" // encode_no_asm(bytes): 0x20, 6, "foobar" -> 0x20, 8, "Zm9vYmFy" // encode_inline_asm_large() -// gas irOptimized: 1373038 +// gas irOptimized: 1373025 // gas legacy: 1672031 // gas legacyOptimized: 1199031 // encode_no_asm_large() -// gas irOptimized: 3276098 +// gas irOptimized: 3276081 // gas legacy: 4705075 // gas legacyOptimized: 2890075 diff --git a/test/libsolidity/semanticTests/externalContracts/deposit_contract.sol b/test/libsolidity/semanticTests/externalContracts/deposit_contract.sol index 38bb477593fe..5e815fad496c 100644 --- a/test/libsolidity/semanticTests/externalContracts/deposit_contract.sol +++ b/test/libsolidity/semanticTests/externalContracts/deposit_contract.sol @@ -176,7 +176,7 @@ contract DepositContract is IDepositContract, ERC165 { } // ---- // constructor() -// gas irOptimized: 1415659 +// gas irOptimized: 1391860 // gas legacy: 2391952 // gas legacyOptimized: 1752320 // supportsInterface(bytes4): 0x0 -> 0 @@ -184,27 +184,27 @@ contract DepositContract is IDepositContract, ERC165 { // supportsInterface(bytes4): 0x01ffc9a700000000000000000000000000000000000000000000000000000000 -> true # ERC-165 id # // supportsInterface(bytes4): 0x8564090700000000000000000000000000000000000000000000000000000000 -> true # the deposit interface id # // get_deposit_root() -> 0xd70a234731285c6804c2a4f56711ddb8c82c99740f207854891028af34e27e5e -// gas irOptimized: 117264 +// gas irOptimized: 116864 // gas legacy: 151981 // gas legacyOptimized: 124447 // get_deposit_count() -> 0x20, 8, 0 # TODO: check balance and logs after each deposit # // deposit(bytes,bytes,bytes,bytes32), 32 ether: 0 -> FAILURE # Empty input # // get_deposit_root() -> 0xd70a234731285c6804c2a4f56711ddb8c82c99740f207854891028af34e27e5e -// gas irOptimized: 117264 +// gas irOptimized: 116864 // gas legacy: 151981 // gas legacyOptimized: 124447 // get_deposit_count() -> 0x20, 8, 0 // deposit(bytes,bytes,bytes,bytes32), 1 ether: 0x80, 0xe0, 0x120, 0xaa4a8d0b7d9077248630f1a4701ae9764e42271d7f22b7838778411857fd349e, 0x30, 0x933ad9491b62059dd065b560d256d8957a8c402cc6e8d8ee7290ae11e8f73292, 0x67a8811c397529dac52ae1342ba58c9500000000000000000000000000000000, 0x20, 0x00f50428677c60f997aadeab24aabf7fceaef491c96a52b463ae91f95611cf71, 0x60, 0xa29d01cc8c6296a8150e515b5995390ef841dc18948aa3e79be6d7c1851b4cbb, 0x5d6ff49fa70b9c782399506a22a85193151b9b691245cebafd2063012443c132, 0x4b6c36debaedefb7b2d71b0503ffdc00150aaffd42e63358238ec888901738b8 -> # txhash: 0x7085c586686d666e8bb6e9477a0f0b09565b2060a11f1c4209d3a52295033832 # // ~ emit DepositEvent(bytes,bytes,bytes,bytes,bytes): 0xa0, 0x0100, 0x0140, 0x0180, 0x0200, 0x30, 0x933ad9491b62059dd065b560d256d8957a8c402cc6e8d8ee7290ae11e8f73292, 0x67a8811c397529dac52ae1342ba58c9500000000000000000000000000000000, 0x20, 0xf50428677c60f997aadeab24aabf7fceaef491c96a52b463ae91f95611cf71, 0x08, 0xca9a3b00000000000000000000000000000000000000000000000000000000, 0x60, 0xa29d01cc8c6296a8150e515b5995390ef841dc18948aa3e79be6d7c1851b4cbb, 0x5d6ff49fa70b9c782399506a22a85193151b9b691245cebafd2063012443c132, 0x4b6c36debaedefb7b2d71b0503ffdc00150aaffd42e63358238ec888901738b8, 0x08, 0x00 // get_deposit_root() -> 0x2089653123d9c721215120b6db6738ba273bbc5228ac093b1f983badcdc8a438 -// gas irOptimized: 117249 +// gas irOptimized: 116849 // gas legacy: 151990 // gas legacyOptimized: 124459 // get_deposit_count() -> 0x20, 8, 0x0100000000000000000000000000000000000000000000000000000000000000 // deposit(bytes,bytes,bytes,bytes32), 32 ether: 0x80, 0xe0, 0x120, 0xdbd986dc85ceb382708cf90a3500f500f0a393c5ece76963ac3ed72eccd2c301, 0x30, 0xb2ce0f79f90e7b3a113ca5783c65756f96c4b4673c2b5c1eb4efc22280259441, 0x06d601211e8866dc5b50dc48a244dd7c00000000000000000000000000000000, 0x20, 0x00344b6c73f71b11c56aba0d01b7d8ad83559f209d0a4101a515f6ad54c89771, 0x60, 0x945caaf82d18e78c033927d51f452ebcd76524497b91d7a11219cb3db6a1d369, 0x7595fc095ce489e46b2ef129591f2f6d079be4faaf345a02c5eb133c072e7c56, 0x0c6c3617eee66b4b878165c502357d49485326bc6b31bc96873f308c8f19c09d -> # txhash: 0x404d8e109822ce448e68f45216c12cb051b784d068fbe98317ab8e50c58304ac # // ~ emit DepositEvent(bytes,bytes,bytes,bytes,bytes): 0xa0, 0x0100, 0x0140, 0x0180, 0x0200, 0x30, 0xb2ce0f79f90e7b3a113ca5783c65756f96c4b4673c2b5c1eb4efc22280259441, 0x06d601211e8866dc5b50dc48a244dd7c00000000000000000000000000000000, 0x20, 0x344b6c73f71b11c56aba0d01b7d8ad83559f209d0a4101a515f6ad54c89771, 0x08, 0x40597307000000000000000000000000000000000000000000000000000000, 0x60, 0x945caaf82d18e78c033927d51f452ebcd76524497b91d7a11219cb3db6a1d369, 0x7595fc095ce489e46b2ef129591f2f6d079be4faaf345a02c5eb133c072e7c56, 0x0c6c3617eee66b4b878165c502357d49485326bc6b31bc96873f308c8f19c09d, 0x08, 0x0100000000000000000000000000000000000000000000000000000000000000 // get_deposit_root() -> 0x40255975859377d912c53aa853245ebd939bdd2b33a28e084babdcc1ed8238ee -// gas irOptimized: 117249 +// gas irOptimized: 116849 // gas legacy: 151990 // gas legacyOptimized: 124459 // get_deposit_count() -> 0x20, 8, 0x0200000000000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/externalContracts/prbmath_signed.sol b/test/libsolidity/semanticTests/externalContracts/prbmath_signed.sol index 7860560f6256..8bb2b37c47c7 100644 --- a/test/libsolidity/semanticTests/externalContracts/prbmath_signed.sol +++ b/test/libsolidity/semanticTests/externalContracts/prbmath_signed.sol @@ -48,7 +48,7 @@ contract test { } // ---- // constructor() -// gas irOptimized: 1870040 +// gas irOptimized: 1849535 // gas legacy: 2430726 // gas legacyOptimized: 1854979 // div(int256,int256): 3141592653589793238, 88714123 -> 35412542528203691288251815328 diff --git a/test/libsolidity/semanticTests/externalContracts/prbmath_unsigned.sol b/test/libsolidity/semanticTests/externalContracts/prbmath_unsigned.sol index 6cda4f1e9831..1e546feab80d 100644 --- a/test/libsolidity/semanticTests/externalContracts/prbmath_unsigned.sol +++ b/test/libsolidity/semanticTests/externalContracts/prbmath_unsigned.sol @@ -48,7 +48,7 @@ contract test { } // ---- // constructor() -// gas irOptimized: 1731900 +// gas irOptimized: 1723462 // gas legacy: 2210160 // gas legacyOptimized: 1734152 // div(uint256,uint256): 3141592653589793238, 88714123 -> 35412542528203691288251815328 diff --git a/test/libsolidity/semanticTests/externalContracts/ramanujan_pi.sol b/test/libsolidity/semanticTests/externalContracts/ramanujan_pi.sol index b3ba4496446f..19a79f537316 100644 --- a/test/libsolidity/semanticTests/externalContracts/ramanujan_pi.sol +++ b/test/libsolidity/semanticTests/externalContracts/ramanujan_pi.sol @@ -33,7 +33,7 @@ contract test { } // ---- // constructor() -// gas irOptimized: 424583 +// gas irOptimized: 406643 // gas legacy: 631753 // gas legacyOptimized: 459425 // prb_pi() -> 3141592656369545286 diff --git a/test/libsolidity/semanticTests/externalContracts/snark.sol b/test/libsolidity/semanticTests/externalContracts/snark.sol index 254befe0142a..e92f95b4ad61 100644 --- a/test/libsolidity/semanticTests/externalContracts/snark.sol +++ b/test/libsolidity/semanticTests/externalContracts/snark.sol @@ -294,11 +294,11 @@ contract Test { // f() -> true // g() -> true // pair() -> true -// gas irOptimized: 269918 +// gas irOptimized: 269901 // gas legacy: 275678 // gas legacyOptimized: 267193 // verifyTx() -> true // ~ emit Verified(string): 0x20, 0x16, "Successfully verified." -// gas irOptimized: 783371 +// gas irOptimized: 783281 // gas legacy: 804346 // gas legacyOptimized: 772349 diff --git a/test/libsolidity/semanticTests/externalContracts/strings.sol b/test/libsolidity/semanticTests/externalContracts/strings.sol index c2ad61557d52..c3eba4e0ffa2 100644 --- a/test/libsolidity/semanticTests/externalContracts/strings.sol +++ b/test/libsolidity/semanticTests/externalContracts/strings.sol @@ -49,7 +49,7 @@ contract test { } // ---- // constructor() -// gas irOptimized: 636074 +// gas irOptimized: 632372 // gas legacy: 1065857 // gas legacyOptimized: 725207 // toSlice(string): 0x20, 11, "hello world" -> 11, 0xa0 @@ -69,6 +69,6 @@ contract test { // gas legacy: 31621 // gas legacyOptimized: 27914 // benchmark(string,bytes32): 0x40, 0x0842021, 8, "solidity" -> 0x2020 -// gas irOptimized: 1981693 +// gas irOptimized: 1981664 // gas legacy: 4235651 // gas legacyOptimized: 2319622 diff --git a/test/libsolidity/semanticTests/functionCall/creation_function_call_with_args.sol b/test/libsolidity/semanticTests/functionCall/creation_function_call_with_args.sol index 0fd2efeb9fb8..cbbded9d5a98 100644 --- a/test/libsolidity/semanticTests/functionCall/creation_function_call_with_args.sol +++ b/test/libsolidity/semanticTests/functionCall/creation_function_call_with_args.sol @@ -15,7 +15,7 @@ contract D { } // ---- // constructor(): 2 -> -// gas irOptimized: 193999 +// gas irOptimized: 193567 // gas legacy: 241234 // gas legacyOptimized: 192961 // f() -> 2 diff --git a/test/libsolidity/semanticTests/functionCall/creation_function_call_with_salt.sol b/test/libsolidity/semanticTests/functionCall/creation_function_call_with_salt.sol index 5952a88e0690..e6b4ae90b28c 100644 --- a/test/libsolidity/semanticTests/functionCall/creation_function_call_with_salt.sol +++ b/test/libsolidity/semanticTests/functionCall/creation_function_call_with_salt.sol @@ -17,7 +17,7 @@ contract D { // EVMVersion: >=constantinople // ---- // constructor(): 2 -> -// gas irOptimized: 194162 +// gas irOptimized: 193730 // gas legacy: 241606 // gas legacyOptimized: 193193 // f() -> 2 diff --git a/test/libsolidity/semanticTests/functionCall/failed_create.sol b/test/libsolidity/semanticTests/functionCall/failed_create.sol index ffe7a7f3777b..6460794adcc7 100644 --- a/test/libsolidity/semanticTests/functionCall/failed_create.sol +++ b/test/libsolidity/semanticTests/functionCall/failed_create.sol @@ -17,7 +17,7 @@ contract C { // EVMVersion: >=byzantium // ---- // constructor(), 20 wei -// gas irOptimized: 177446 +// gas irOptimized: 171806 // gas legacy: 285547 // gas legacyOptimized: 168515 // f(uint256): 20 -> 0x137aa4dfc0911524504fcd4d98501f179bc13b4a @@ -25,7 +25,7 @@ contract C { // f(uint256): 20 -> FAILURE // x() -> 1 // stack(uint256): 1023 -> FAILURE -// gas irOptimized: 259624 +// gas irOptimized: 252410 // gas legacy: 477722 // gas legacyOptimized: 299567 // x() -> 1 diff --git a/test/libsolidity/semanticTests/functionCall/gas_and_value_basic.sol b/test/libsolidity/semanticTests/functionCall/gas_and_value_basic.sol index 9c73e208e73e..6ebab90fff64 100644 --- a/test/libsolidity/semanticTests/functionCall/gas_and_value_basic.sol +++ b/test/libsolidity/semanticTests/functionCall/gas_and_value_basic.sol @@ -38,7 +38,7 @@ contract test { } // ---- // constructor(), 20 wei -> -// gas irOptimized: 260052 +// gas irOptimized: 253950 // gas legacy: 391588 // gas legacyOptimized: 268089 // sendAmount(uint256): 5 -> 5 diff --git a/test/libsolidity/semanticTests/functionCall/gas_and_value_brace_syntax.sol b/test/libsolidity/semanticTests/functionCall/gas_and_value_brace_syntax.sol index 801b22d1772a..1cb5e0d54820 100644 --- a/test/libsolidity/semanticTests/functionCall/gas_and_value_brace_syntax.sol +++ b/test/libsolidity/semanticTests/functionCall/gas_and_value_brace_syntax.sol @@ -37,7 +37,7 @@ contract test { } // ---- // constructor(), 20 wei -> -// gas irOptimized: 260052 +// gas irOptimized: 253950 // gas legacy: 391588 // gas legacyOptimized: 268089 // sendAmount(uint256): 5 -> 5 diff --git a/test/libsolidity/semanticTests/functionCall/mapping_array_internal_argument.sol b/test/libsolidity/semanticTests/functionCall/mapping_array_internal_argument.sol index bb2221f2c3a1..28c1822d77b7 100644 --- a/test/libsolidity/semanticTests/functionCall/mapping_array_internal_argument.sol +++ b/test/libsolidity/semanticTests/functionCall/mapping_array_internal_argument.sol @@ -18,7 +18,7 @@ contract test { } // ---- // set(uint8,uint8,uint8,uint8,uint8): 1, 21, 22, 42, 43 -> 0, 0, 0, 0 -// gas irOptimized: 111668 +// gas irOptimized: 111628 // gas legacy: 113748 // gas legacyOptimized: 111772 // get(uint8): 1 -> 21, 22, 42, 43 diff --git a/test/libsolidity/semanticTests/immutable/multi_creation.sol b/test/libsolidity/semanticTests/immutable/multi_creation.sol index 8aaf961aa254..e03861450997 100644 --- a/test/libsolidity/semanticTests/immutable/multi_creation.sol +++ b/test/libsolidity/semanticTests/immutable/multi_creation.sol @@ -27,7 +27,7 @@ contract C { } // ---- // f() -> 3, 7, 5 -// gas irOptimized: 124849 +// gas irOptimized: 124003 // gas legacy: 148528 // gas legacyOptimized: 123971 // x() -> 7 diff --git a/test/libsolidity/semanticTests/immutable/use_scratch.sol b/test/libsolidity/semanticTests/immutable/use_scratch.sol index ff10c13aa2b5..0a5ccf729f59 100644 --- a/test/libsolidity/semanticTests/immutable/use_scratch.sol +++ b/test/libsolidity/semanticTests/immutable/use_scratch.sol @@ -15,7 +15,7 @@ contract C { } // ---- // constructor(): 3 -> -// gas irOptimized: 124838 +// gas irOptimized: 123542 // gas legacy: 197645 // gas legacyOptimized: 137678 // f() -> 84, 23 diff --git a/test/libsolidity/semanticTests/inheritance/value_for_constructor.sol b/test/libsolidity/semanticTests/inheritance/value_for_constructor.sol index 5390f64db082..3866d3be0a4c 100644 --- a/test/libsolidity/semanticTests/inheritance/value_for_constructor.sol +++ b/test/libsolidity/semanticTests/inheritance/value_for_constructor.sol @@ -39,7 +39,7 @@ contract Main { } // ---- // constructor(), 22 wei -> -// gas irOptimized: 266886 +// gas irOptimized: 262320 // gas legacy: 392786 // gas legacyOptimized: 261633 // getFlag() -> true diff --git a/test/libsolidity/semanticTests/isoltestTesting/balance_other_contract.sol b/test/libsolidity/semanticTests/isoltestTesting/balance_other_contract.sol index 39f3c2d0faab..306bc35670fe 100644 --- a/test/libsolidity/semanticTests/isoltestTesting/balance_other_contract.sol +++ b/test/libsolidity/semanticTests/isoltestTesting/balance_other_contract.sol @@ -16,7 +16,7 @@ contract ClientReceipt { } // ---- // constructor(), 2000 wei -> -// gas irOptimized: 171865 +// gas irOptimized: 169915 // gas legacy: 230038 // gas legacyOptimized: 173883 // balance -> 1500 diff --git a/test/libsolidity/semanticTests/libraries/internal_types_in_library.sol b/test/libsolidity/semanticTests/libraries/internal_types_in_library.sol index 169f2e295b6b..8a4356061d3d 100644 --- a/test/libsolidity/semanticTests/libraries/internal_types_in_library.sol +++ b/test/libsolidity/semanticTests/libraries/internal_types_in_library.sol @@ -22,6 +22,6 @@ contract Test { // ---- // library: Lib // f() -> 4, 0x11 -// gas irOptimized: 112209 +// gas irOptimized: 112115 // gas legacy: 135413 // gas legacyOptimized: 119325 diff --git a/test/libsolidity/semanticTests/libraries/using_library_mappings_public.sol b/test/libsolidity/semanticTests/libraries/using_library_mappings_public.sol index b180d52e4e39..1f06908e2cc1 100644 --- a/test/libsolidity/semanticTests/libraries/using_library_mappings_public.sol +++ b/test/libsolidity/semanticTests/libraries/using_library_mappings_public.sol @@ -19,6 +19,6 @@ contract Test { // ---- // library: Lib // f() -> 1, 0, 0x2a, 0x17, 0, 0x63 -// gas irOptimized: 119654 +// gas irOptimized: 119642 // gas legacy: 124674 // gas legacyOptimized: 119669 diff --git a/test/libsolidity/semanticTests/libraries/using_library_mappings_return.sol b/test/libsolidity/semanticTests/libraries/using_library_mappings_return.sol index d46ed0a56a38..e26ccacb9c6b 100644 --- a/test/libsolidity/semanticTests/libraries/using_library_mappings_return.sol +++ b/test/libsolidity/semanticTests/libraries/using_library_mappings_return.sol @@ -17,6 +17,6 @@ contract Test { // ---- // library: Lib // f() -> 1, 0, 0x2a, 0x17, 0, 0x63 -// gas irOptimized: 120265 +// gas irOptimized: 120200 // gas legacy: 125109 // gas legacyOptimized: 120128 diff --git a/test/libsolidity/semanticTests/salted_create/salted_create.sol b/test/libsolidity/semanticTests/salted_create/salted_create.sol index 11b74168d993..743ff5fd2a23 100644 --- a/test/libsolidity/semanticTests/salted_create/salted_create.sol +++ b/test/libsolidity/semanticTests/salted_create/salted_create.sol @@ -21,6 +21,6 @@ contract A { // ---- // different_salt() -> true // same_salt() -> true -// gas irOptimized: 98438897 +// gas irOptimized: 98438895 // gas legacy: 98439109 // gas legacyOptimized: 98438967 diff --git a/test/libsolidity/semanticTests/salted_create/salted_create_with_value.sol b/test/libsolidity/semanticTests/salted_create/salted_create_with_value.sol index 025c8259db56..34180fa6976e 100644 --- a/test/libsolidity/semanticTests/salted_create/salted_create_with_value.sol +++ b/test/libsolidity/semanticTests/salted_create/salted_create_with_value.sol @@ -21,6 +21,6 @@ contract A { // EVMVersion: >=constantinople // ---- // f(), 10 ether -> 3007, 3008, 3009 -// gas irOptimized: 254238 +// gas irOptimized: 253035 // gas legacy: 381063 // gas legacyOptimized: 279694 diff --git a/test/libsolidity/semanticTests/smoke/constructor.sol b/test/libsolidity/semanticTests/smoke/constructor.sol index eb1d73a448ed..79b92867bc0d 100644 --- a/test/libsolidity/semanticTests/smoke/constructor.sol +++ b/test/libsolidity/semanticTests/smoke/constructor.sol @@ -12,7 +12,7 @@ contract C { } // ---- // constructor(), 2 wei: 3 -> -// gas irOptimized: 106374 +// gas irOptimized: 104412 // gas legacy: 148308 // gas legacyOptimized: 106727 // state() -> 3 diff --git a/test/libsolidity/semanticTests/state/blockhash_basic.sol b/test/libsolidity/semanticTests/state/blockhash_basic.sol index 62138a9b2863..01069aa0c6dc 100644 --- a/test/libsolidity/semanticTests/state/blockhash_basic.sol +++ b/test/libsolidity/semanticTests/state/blockhash_basic.sol @@ -12,7 +12,7 @@ contract C { } // ---- // constructor() -// gas irOptimized: 109878 +// gas irOptimized: 108150 // gas legacy: 152179 // gas legacyOptimized: 106750 // genesisHash() -> 0x3737373737373737373737373737373737373737373737373737373737373737 diff --git a/test/libsolidity/semanticTests/storage/empty_nonempty_empty.sol b/test/libsolidity/semanticTests/storage/empty_nonempty_empty.sol index 20755a0694c7..7897144d52d6 100644 --- a/test/libsolidity/semanticTests/storage/empty_nonempty_empty.sol +++ b/test/libsolidity/semanticTests/storage/empty_nonempty_empty.sol @@ -22,9 +22,9 @@ contract Test { // set(bytes): 0x20, 0 // storageEmpty -> 1 // set(bytes): 0x20, 66, "12345678901234567890123456789012", "12345678901234567890123456789012", "12" -// gas irOptimized: 111895 +// gas irOptimized: 111878 // gas legacy: 112734 -// gas legacyOptimized: 112110 +// gas legacyOptimized: 112115 // storageEmpty -> 0 // set(bytes): 0x20, 3, "abc" // storageEmpty -> 0 diff --git a/test/libsolidity/semanticTests/storage/packed_storage_structs_bytes.sol b/test/libsolidity/semanticTests/storage/packed_storage_structs_bytes.sol index b1686d90748d..2c29abc79bb0 100644 --- a/test/libsolidity/semanticTests/storage/packed_storage_structs_bytes.sol +++ b/test/libsolidity/semanticTests/storage/packed_storage_structs_bytes.sol @@ -42,6 +42,6 @@ contract C { } // ---- // test() -> true -// gas irOptimized: 132505 +// gas irOptimized: 132493 // gas legacy: 136009 // gas legacyOptimized: 133478 diff --git a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_nested_array_to_storage.sol b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_nested_array_to_storage.sol index 0bcc74b6ba54..add42a8f3b18 100644 --- a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_nested_array_to_storage.sol +++ b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_nested_array_to_storage.sol @@ -16,6 +16,6 @@ contract C { } // ---- // f(uint32,(uint128,uint256[][2],uint32)): 55, 0x40, 77, 0x60, 88, 0x40, 0x40, 2, 1, 2 -> 55, 77, 1, 2, 88 -// gas irOptimized: 202829 +// gas irOptimized: 202843 // gas legacy: 207384 // gas legacyOptimized: 203584 diff --git a/test/libsolidity/semanticTests/structs/conversion/recursive_storage_memory.sol b/test/libsolidity/semanticTests/structs/conversion/recursive_storage_memory.sol index 52ad00649bec..699836179be2 100644 --- a/test/libsolidity/semanticTests/structs/conversion/recursive_storage_memory.sol +++ b/test/libsolidity/semanticTests/structs/conversion/recursive_storage_memory.sol @@ -23,6 +23,6 @@ contract CopyTest { } // ---- // run() -> 2, 23, 42 -// gas irOptimized: 193687 +// gas irOptimized: 193677 // gas legacy: 185731 // gas legacyOptimized: 184458 diff --git a/test/libsolidity/semanticTests/structs/copy_from_mapping.sol b/test/libsolidity/semanticTests/structs/copy_from_mapping.sol index df118de3231d..75898d31629f 100644 --- a/test/libsolidity/semanticTests/structs/copy_from_mapping.sol +++ b/test/libsolidity/semanticTests/structs/copy_from_mapping.sol @@ -36,8 +36,8 @@ contract C { } // ---- // to_state() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -// gas irOptimized: 121497 +// gas irOptimized: 121487 // gas legacy: 123069 -// gas legacyOptimized: 121758 +// gas legacyOptimized: 121759 // to_storage() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 // to_memory() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 diff --git a/test/libsolidity/semanticTests/structs/copy_struct_array_from_storage.sol b/test/libsolidity/semanticTests/structs/copy_struct_array_from_storage.sol index aed54f98b6ac..937eeeaf437e 100644 --- a/test/libsolidity/semanticTests/structs/copy_struct_array_from_storage.sol +++ b/test/libsolidity/semanticTests/structs/copy_struct_array_from_storage.sol @@ -87,7 +87,7 @@ contract Test { // EVMVersion: >homestead // ---- // test1() -> true -// gas irOptimized: 152954 +// gas irOptimized: 152882 // gas legacy: 153012 // gas legacyOptimized: 152637 // test2() -> true diff --git a/test/libsolidity/semanticTests/structs/copy_substructures_from_mapping.sol b/test/libsolidity/semanticTests/structs/copy_substructures_from_mapping.sol index 66954a7f5c16..b6e374f2a22f 100644 --- a/test/libsolidity/semanticTests/structs/copy_substructures_from_mapping.sol +++ b/test/libsolidity/semanticTests/structs/copy_substructures_from_mapping.sol @@ -44,8 +44,8 @@ contract C { } // ---- // to_state() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -// gas irOptimized: 121598 +// gas irOptimized: 121584 // gas legacy: 123208 -// gas legacyOptimized: 121765 +// gas legacyOptimized: 121766 // to_storage() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 // to_memory() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 diff --git a/test/libsolidity/semanticTests/structs/copy_substructures_to_mapping.sol b/test/libsolidity/semanticTests/structs/copy_substructures_to_mapping.sol index 065187cdc348..2e1d5cb2d472 100644 --- a/test/libsolidity/semanticTests/structs/copy_substructures_to_mapping.sol +++ b/test/libsolidity/semanticTests/structs/copy_substructures_to_mapping.sol @@ -52,14 +52,14 @@ contract C { } // ---- // from_memory() -> 0x20, 0x60, 0xa0, 0x15, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -// gas irOptimized: 123029 +// gas irOptimized: 123028 // gas legacy: 130227 -// gas legacyOptimized: 128762 +// gas legacyOptimized: 128761 // from_state() -> 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -// gas irOptimized: 121721 +// gas irOptimized: 121703 // gas legacy: 123282 -// gas legacyOptimized: 121870 +// gas legacyOptimized: 121871 // from_calldata((bytes,uint16[],uint16)): 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -> 0x20, 0x60, 0xa0, 0x15, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -// gas irOptimized: 115116 +// gas irOptimized: 115113 // gas legacy: 122516 -// gas legacyOptimized: 120806 +// gas legacyOptimized: 120807 diff --git a/test/libsolidity/semanticTests/structs/copy_to_mapping.sol b/test/libsolidity/semanticTests/structs/copy_to_mapping.sol index 5b99efc6477d..5b55a99b9239 100644 --- a/test/libsolidity/semanticTests/structs/copy_to_mapping.sol +++ b/test/libsolidity/semanticTests/structs/copy_to_mapping.sol @@ -45,18 +45,18 @@ contract C { } // ---- // from_state() -> 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -// gas irOptimized: 121693 +// gas irOptimized: 121680 // gas legacy: 123144 // gas legacyOptimized: 121811 // from_storage() -> 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -// gas irOptimized: 121737 +// gas irOptimized: 121725 // gas legacy: 123193 // gas legacyOptimized: 121863 // from_memory() -> 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -// gas irOptimized: 122942 +// gas irOptimized: 122939 // gas legacy: 130088 // gas legacyOptimized: 128757 // from_calldata((bytes,uint16[],uint16)): 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -> 0x20, 0x60, 0xa0, 21, 3, 0x666f6f0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -// gas irOptimized: 115056 +// gas irOptimized: 115032 // gas legacy: 118301 // gas legacyOptimized: 115435 diff --git a/test/libsolidity/semanticTests/structs/memory_structs_nested_load.sol b/test/libsolidity/semanticTests/structs/memory_structs_nested_load.sol index 3089f97b52ac..e5b139d5c3c7 100644 --- a/test/libsolidity/semanticTests/structs/memory_structs_nested_load.sol +++ b/test/libsolidity/semanticTests/structs/memory_structs_nested_load.sol @@ -66,7 +66,7 @@ contract Test { } // ---- // load() -> 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 -// gas irOptimized: 110326 +// gas irOptimized: 110317 // gas legacy: 112964 // gas legacyOptimized: 110876 // store() -> 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 diff --git a/test/libsolidity/semanticTests/structs/struct_containing_bytes_copy_and_delete.sol b/test/libsolidity/semanticTests/structs/struct_containing_bytes_copy_and_delete.sol index 4a64f08136b6..c8437300d558 100644 --- a/test/libsolidity/semanticTests/structs/struct_containing_bytes_copy_and_delete.sol +++ b/test/libsolidity/semanticTests/structs/struct_containing_bytes_copy_and_delete.sol @@ -23,17 +23,17 @@ contract c { // ---- // storageEmpty -> 1 // set(uint256,bytes,uint256): 12, 0x60, 13, 33, "12345678901234567890123456789012", "3" -> true -// gas irOptimized: 133596 +// gas irOptimized: 133582 // gas legacy: 134628 -// gas legacyOptimized: 133875 +// gas legacyOptimized: 133874 // test(uint256): 32 -> "3" // storageEmpty -> 0 // copy() -> true // storageEmpty -> 1 // set(uint256,bytes,uint256): 12, 0x60, 13, 33, "12345678901234567890123456789012", "3" -> true -// gas irOptimized: 133596 +// gas irOptimized: 133582 // gas legacy: 134628 -// gas legacyOptimized: 133875 +// gas legacyOptimized: 133874 // storageEmpty -> 0 // del() -> true // storageEmpty -> 1 diff --git a/test/libsolidity/semanticTests/structs/struct_copy.sol b/test/libsolidity/semanticTests/structs/struct_copy.sol index 6da42ebec7d4..a321f0686897 100644 --- a/test/libsolidity/semanticTests/structs/struct_copy.sol +++ b/test/libsolidity/semanticTests/structs/struct_copy.sol @@ -35,12 +35,12 @@ contract c { } // ---- // set(uint256): 7 -> true -// gas irOptimized: 109896 +// gas irOptimized: 109893 // gas legacy: 110597 // gas legacyOptimized: 110003 // retrieve(uint256): 7 -> 1, 3, 4, 2 // copy(uint256,uint256): 7, 8 -> true -// gas irOptimized: 118593 +// gas irOptimized: 118582 // gas legacy: 119147 // gas legacyOptimized: 118619 // retrieve(uint256): 7 -> 1, 3, 4, 2 diff --git a/test/libsolidity/semanticTests/structs/struct_copy_via_local.sol b/test/libsolidity/semanticTests/structs/struct_copy_via_local.sol index 22d9dd29deb5..71b40acc80f6 100644 --- a/test/libsolidity/semanticTests/structs/struct_copy_via_local.sol +++ b/test/libsolidity/semanticTests/structs/struct_copy_via_local.sol @@ -17,6 +17,6 @@ contract c { } // ---- // test() -> true -// gas irOptimized: 109713 +// gas irOptimized: 109706 // gas legacy: 110615 // gas legacyOptimized: 109705 diff --git a/test/libsolidity/semanticTests/structs/struct_delete_storage_with_array.sol b/test/libsolidity/semanticTests/structs/struct_delete_storage_with_array.sol index 7ec85c929d65..d76618bbc9fc 100644 --- a/test/libsolidity/semanticTests/structs/struct_delete_storage_with_array.sol +++ b/test/libsolidity/semanticTests/structs/struct_delete_storage_with_array.sol @@ -42,10 +42,10 @@ contract C { } // ---- // f() -> -// gas irOptimized: 113232 +// gas irOptimized: 113210 // gas legacy: 113591 // gas legacyOptimized: 113103 // g() -> -// gas irOptimized: 118604 +// gas irOptimized: 118580 // gas legacy: 118764 // gas legacyOptimized: 118172 diff --git a/test/libsolidity/semanticTests/structs/struct_memory_to_storage_function_ptr.sol b/test/libsolidity/semanticTests/structs/struct_memory_to_storage_function_ptr.sol index c19875062f9b..9af3774692a9 100644 --- a/test/libsolidity/semanticTests/structs/struct_memory_to_storage_function_ptr.sol +++ b/test/libsolidity/semanticTests/structs/struct_memory_to_storage_function_ptr.sol @@ -28,6 +28,6 @@ contract C { } // ---- // f() -> 42, 23, 34, 42, 42 -// gas irOptimized: 110388 +// gas irOptimized: 110382 // gas legacy: 111993 // gas legacyOptimized: 110546 diff --git a/test/libsolidity/semanticTests/structs/structs.sol b/test/libsolidity/semanticTests/structs/structs.sol index 61456cd7e30a..b5e9d10bb844 100644 --- a/test/libsolidity/semanticTests/structs/structs.sol +++ b/test/libsolidity/semanticTests/structs/structs.sol @@ -30,7 +30,7 @@ contract test { // ---- // check() -> false // set() -> -// gas irOptimized: 134435 +// gas irOptimized: 134417 // gas legacy: 135246 // gas legacyOptimized: 134062 // check() -> true diff --git a/test/libsolidity/semanticTests/userDefinedValueType/calldata.sol b/test/libsolidity/semanticTests/userDefinedValueType/calldata.sol index 1e58c9b037cf..2e85c3463718 100644 --- a/test/libsolidity/semanticTests/userDefinedValueType/calldata.sol +++ b/test/libsolidity/semanticTests/userDefinedValueType/calldata.sol @@ -49,11 +49,11 @@ contract C { } // ---- // test_f() -> true -// gas irOptimized: 122489 +// gas irOptimized: 122388 // gas legacy: 126030 // gas legacyOptimized: 123120 // test_g() -> true -// gas irOptimized: 106871 +// gas irOptimized: 106740 // gas legacy: 112300 // gas legacyOptimized: 107649 // addresses(uint256): 0 -> 0x18 diff --git a/test/libsolidity/semanticTests/userDefinedValueType/erc20.sol b/test/libsolidity/semanticTests/userDefinedValueType/erc20.sol index 31e754a9b7b1..27ab530cd76d 100644 --- a/test/libsolidity/semanticTests/userDefinedValueType/erc20.sol +++ b/test/libsolidity/semanticTests/userDefinedValueType/erc20.sol @@ -113,7 +113,7 @@ contract ERC20 { // ---- // constructor() // ~ emit Transfer(address,address,uint256): #0x00, #0x1212121212121212121212121212120000000012, 0x14 -// gas irOptimized: 360201 +// gas irOptimized: 352698 // gas legacy: 834932 // gas legacyOptimized: 412648 // totalSupply() -> 20 diff --git a/test/libsolidity/semanticTests/various/address_code.sol b/test/libsolidity/semanticTests/various/address_code.sol index 2712503a45c5..6067377466da 100644 --- a/test/libsolidity/semanticTests/various/address_code.sol +++ b/test/libsolidity/semanticTests/various/address_code.sol @@ -14,9 +14,9 @@ contract C { } // ---- // constructor() -> -// gas irOptimized: 175145 +// gas irOptimized: 172853 // gas legacy: 241796 -// gas legacyOptimized: 153411 +// gas legacyOptimized: 153454 // initCode() -> 0x20, 0 // f() -> true // g() -> 0 diff --git a/test/libsolidity/semanticTests/various/create_calldata.sol b/test/libsolidity/semanticTests/various/create_calldata.sol index fc4e885ff12a..b40b0eab4166 100644 --- a/test/libsolidity/semanticTests/various/create_calldata.sol +++ b/test/libsolidity/semanticTests/various/create_calldata.sol @@ -8,7 +8,7 @@ contract C { } // ---- // constructor(): 42 -> -// gas irOptimized: 146699 +// gas irOptimized: 144924 // gas legacy: 173845 -// gas legacyOptimized: 137736 +// gas legacyOptimized: 137677 // s() -> 0x20, 0 diff --git a/test/libsolidity/semanticTests/various/destructuring_assignment.sol b/test/libsolidity/semanticTests/various/destructuring_assignment.sol index 1534891dc1b8..b13db85d15f8 100644 --- a/test/libsolidity/semanticTests/various/destructuring_assignment.sol +++ b/test/libsolidity/semanticTests/various/destructuring_assignment.sol @@ -33,6 +33,6 @@ contract C { } // ---- // f(bytes): 0x20, 0x5, "abcde" -> 0 -// gas irOptimized: 241853 +// gas irOptimized: 241832 // gas legacy: 243284 -// gas legacyOptimized: 242421 +// gas legacyOptimized: 242420 diff --git a/test/libsolidity/semanticTests/various/erc20.sol b/test/libsolidity/semanticTests/various/erc20.sol index 47f4005e3880..b752a5210152 100644 --- a/test/libsolidity/semanticTests/various/erc20.sol +++ b/test/libsolidity/semanticTests/various/erc20.sol @@ -96,7 +96,7 @@ contract ERC20 { // ---- // constructor() // ~ emit Transfer(address,address,uint256): #0x00, #0x1212121212121212121212121212120000000012, 0x14 -// gas irOptimized: 355485 +// gas irOptimized: 353276 // gas legacy: 807683 // gas legacyOptimized: 408718 // totalSupply() -> 20 diff --git a/test/libsolidity/semanticTests/various/negative_stack_height.sol b/test/libsolidity/semanticTests/various/negative_stack_height.sol index 92b6b5650cbb..3c9130e9fdf0 100644 --- a/test/libsolidity/semanticTests/various/negative_stack_height.sol +++ b/test/libsolidity/semanticTests/various/negative_stack_height.sol @@ -66,4 +66,4 @@ contract C { // ---- // constructor() -> // gas legacy: 575272 -// gas legacyOptimized: 346970 +// gas legacyOptimized: 345026 diff --git a/test/libsolidity/semanticTests/various/senders_balance.sol b/test/libsolidity/semanticTests/various/senders_balance.sol index 6a8da27784f1..37d6919db38c 100644 --- a/test/libsolidity/semanticTests/various/senders_balance.sol +++ b/test/libsolidity/semanticTests/various/senders_balance.sol @@ -16,7 +16,7 @@ contract D { } // ---- // constructor(), 27 wei -> -// gas irOptimized: 169377 +// gas irOptimized: 168729 // gas legacy: 218459 // gas legacyOptimized: 167292 // f() -> 27 diff --git a/test/libsolidity/semanticTests/various/skip_dynamic_types_for_structs.sol b/test/libsolidity/semanticTests/various/skip_dynamic_types_for_structs.sol index efff7a95073a..e6b9a6aae7bd 100644 --- a/test/libsolidity/semanticTests/various/skip_dynamic_types_for_structs.sol +++ b/test/libsolidity/semanticTests/various/skip_dynamic_types_for_structs.sol @@ -19,6 +19,6 @@ contract C { } // ---- // g() -> 2, 6 -// gas irOptimized: 178542 +// gas irOptimized: 178487 // gas legacy: 180839 -// gas legacyOptimized: 179375 +// gas legacyOptimized: 179374 diff --git a/test/libsolidity/semanticTests/various/staticcall_for_view_and_pure.sol b/test/libsolidity/semanticTests/various/staticcall_for_view_and_pure.sol index d95a2cd7ca8f..1306529d4183 100644 --- a/test/libsolidity/semanticTests/various/staticcall_for_view_and_pure.sol +++ b/test/libsolidity/semanticTests/various/staticcall_for_view_and_pure.sol @@ -37,10 +37,10 @@ contract D { // f() -> 0x1 # This should work, next should throw # // gas legacy: 102095 // fview() -> FAILURE -// gas irOptimized: 98438596 +// gas irOptimized: 98438588 // gas legacy: 98438774 // gas legacyOptimized: 98438580 // fpure() -> FAILURE -// gas irOptimized: 98438596 +// gas irOptimized: 98438589 // gas legacy: 98438774 // gas legacyOptimized: 98438580 diff --git a/test/libsolidity/semanticTests/various/swap_in_storage_overwrite.sol b/test/libsolidity/semanticTests/various/swap_in_storage_overwrite.sol index 482847b67f64..bd5a59519c8d 100644 --- a/test/libsolidity/semanticTests/various/swap_in_storage_overwrite.sol +++ b/test/libsolidity/semanticTests/various/swap_in_storage_overwrite.sol @@ -26,7 +26,7 @@ contract c { // x() -> 0, 0 // y() -> 0, 0 // set() -> -// gas irOptimized: 109690 +// gas irOptimized: 109684 // gas legacy: 109728 // gas legacyOptimized: 109680 // x() -> 1, 2 diff --git a/test/libsolidity/semanticTests/various/value_complex.sol b/test/libsolidity/semanticTests/various/value_complex.sol index 80f8bb55cc82..880dfbc20823 100644 --- a/test/libsolidity/semanticTests/various/value_complex.sol +++ b/test/libsolidity/semanticTests/various/value_complex.sol @@ -19,7 +19,7 @@ contract test { } // ---- // constructor(), 20 wei -> -// gas irOptimized: 174351 +// gas irOptimized: 173055 // gas legacy: 252296 // gas legacyOptimized: 180352 // sendAmount(uint256): 5 -> 8 diff --git a/test/libsolidity/semanticTests/various/value_insane.sol b/test/libsolidity/semanticTests/various/value_insane.sol index 4a4432758458..897b9faba432 100644 --- a/test/libsolidity/semanticTests/various/value_insane.sol +++ b/test/libsolidity/semanticTests/various/value_insane.sol @@ -18,7 +18,7 @@ contract test { } // ---- // constructor(), 20 wei -> -// gas irOptimized: 175215 +// gas irOptimized: 173919 // gas legacy: 253820 // gas legacyOptimized: 180784 // sendAmount(uint256): 5 -> 8 diff --git a/test/libsolidity/semanticTests/viaYul/copy_struct_invalid_ir_bug.sol b/test/libsolidity/semanticTests/viaYul/copy_struct_invalid_ir_bug.sol index 4b8f599a8f98..ed5ecf3ed193 100644 --- a/test/libsolidity/semanticTests/viaYul/copy_struct_invalid_ir_bug.sol +++ b/test/libsolidity/semanticTests/viaYul/copy_struct_invalid_ir_bug.sol @@ -21,6 +21,6 @@ contract C { } // ---- // f() -> -// gas irOptimized: 113010 +// gas irOptimized: 112980 // gas legacy: 112890 // gas legacyOptimized: 112580 diff --git a/test/libyul/yulOptimizerTests/fullSuite/abi_example1.yul b/test/libyul/yulOptimizerTests/fullSuite/abi_example1.yul index b69d19cdb270..8a453e00408a 100644 --- a/test/libyul/yulOptimizerTests/fullSuite/abi_example1.yul +++ b/test/libyul/yulOptimizerTests/fullSuite/abi_example1.yul @@ -457,26 +457,25 @@ } } // ==== -// EVMVersion: >=constantinople +// EVMVersion: >=shanghai // ---- // step: fullSuite // // { // { -// let _1 := 0 -// let _2 := mload(_1) +// let _1 := mload(0) // let pos := 0x20 -// let length := mload(_2) +// let length := mload(_1) // mstore(pos, length) // pos := 64 -// let srcPtr := add(_2, 0x20) -// let i := _1 +// let srcPtr := add(_1, 0x20) +// let i := 0 // for { } lt(i, length) { i := add(i, 1) } // { -// let _3 := mload(srcPtr) +// let _2 := mload(srcPtr) // let pos_1 := pos -// let srcPtr_1 := _3 -// let i_1 := _1 +// let srcPtr_1 := _2 +// let i_1 := 0 // for { } lt(i_1, 0x3) { i_1 := add(i_1, 1) } // { // mstore(pos_1, and(mload(srcPtr_1), sub(shl(160, 1), 1))) @@ -489,7 +488,7 @@ // let a, b, c, d := abi_decode_uint256t_uint256t_array_uint256_dynt_array_array_uint256_memory_dyn(mload(0x20), mload(64)) // sstore(a, b) // sstore(c, d) -// sstore(_1, pos) +// sstore(0, pos) // } // function abi_decode_array_array_uint256_memory_dyn(offset, end) -> array // { diff --git a/test/libyul/yulOptimizerTests/fullSuite/clear_after_if_continue.yul b/test/libyul/yulOptimizerTests/fullSuite/clear_after_if_continue.yul index 71ed36d9794d..d5a5af8338ce 100644 --- a/test/libyul/yulOptimizerTests/fullSuite/clear_after_if_continue.yul +++ b/test/libyul/yulOptimizerTests/fullSuite/clear_after_if_continue.yul @@ -6,6 +6,8 @@ } if y { revert(0, 0) } } +// ==== +// EVMVersion: >=shanghai // ---- // step: fullSuite // @@ -13,15 +15,7 @@ // { // let y := mload(0x20) // let _1 := iszero(and(y, 8)) -// for { } -// iszero(_1) -// { -// if y -// { -// let _2 := 0 -// revert(_2, _2) -// } -// } +// for { } iszero(_1) { if y { revert(0, 0) } } // { // if y { continue } // sstore(1, 0) diff --git a/test/libyul/yulOptimizerTests/fullSuite/create2_and_mask.yul b/test/libyul/yulOptimizerTests/fullSuite/create2_and_mask.yul index 813c2706e3d5..f9d248e2feeb 100644 --- a/test/libyul/yulOptimizerTests/fullSuite/create2_and_mask.yul +++ b/test/libyul/yulOptimizerTests/fullSuite/create2_and_mask.yul @@ -7,15 +7,14 @@ sstore(a, b) } // ==== -// EVMVersion: >=constantinople +// EVMVersion: >=shanghai // ---- // step: fullSuite // // { // { // let _1 := sub(shl(160, 1), 1) -// let _2 := 0 -// let a := and(create2(_2, _2, 0x20, _2), _1) -// sstore(a, and(_1, create2(_2, _2, 0x20, _2))) +// let a := and(create2(0, 0, 0x20, 0), _1) +// sstore(a, and(_1, create2(0, 0, 0x20, 0))) // } // } diff --git a/test/libyul/yulOptimizerTests/fullSuite/static_array_slot_computation.yul b/test/libyul/yulOptimizerTests/fullSuite/static_array_slot_computation.yul index 72c09d3dc37b..bf74af6f4713 100644 --- a/test/libyul/yulOptimizerTests/fullSuite/static_array_slot_computation.yul +++ b/test/libyul/yulOptimizerTests/fullSuite/static_array_slot_computation.yul @@ -22,22 +22,21 @@ } } // ==== -// EVMVersion: >=constantinople +// EVMVersion: >=shanghai // ---- // step: fullSuite // // { // { -// let _1 := 0 -// if eq(0x26121ff0, shr(224, calldataload(_1))) +// if eq(0x26121ff0, shr(224, calldataload(0))) // { -// if callvalue() { revert(_1, _1) } -// if slt(add(calldatasize(), not(3)), _1) { revert(_1, _1) } -// if iszero(lt(0x0a, sload(_1))) +// if callvalue() { revert(0, 0) } +// if slt(add(calldatasize(), not(3)), 0) { revert(0, 0) } +// if iszero(lt(0x0a, sload(0))) // { -// mstore(_1, shl(224, 0x4e487b71)) +// mstore(0, shl(224, 0x4e487b71)) // mstore(4, 0x32) -// revert(_1, 0x24) +// revert(0, 0x24) // } // sstore(0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56d, 0x05) // } diff --git a/test/libyul/yulOptimizerTests/fullSuite/unusedFunctionParameterPruner_loop.yul b/test/libyul/yulOptimizerTests/fullSuite/unusedFunctionParameterPruner_loop.yul index 7955ee12eaed..f0b7546d0592 100644 --- a/test/libyul/yulOptimizerTests/fullSuite/unusedFunctionParameterPruner_loop.yul +++ b/test/libyul/yulOptimizerTests/fullSuite/unusedFunctionParameterPruner_loop.yul @@ -12,6 +12,8 @@ } } } +// ==== +// EVMVersion: >=shanghai // ---- // step: fullSuite // @@ -25,13 +27,12 @@ // function f() // { // let b := 10 -// let _1 := 0 -// let a := calldataload(_1) -// let _2 := iszero(a) +// let a := calldataload(0) +// let _1 := iszero(a) // for { } iszero(b) { b := add(b, not(0)) } // { -// mstore(a, _1) -// if _2 { leave } +// mstore(a, 0) +// if _1 { leave } // } // } // } From ec240c64220ad6661c9b70103cfd8c3ef850c568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 7 Aug 2023 17:23:53 +0200 Subject: [PATCH 027/150] CI: Set CPUs for soltest.sh based on the number of available cores --- .circleci/config.yml | 19 +++++++++++++++++++ .circleci/soltest.sh | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 38e9ee47f260..c3e1c588bd69 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -366,6 +366,7 @@ defaults: environment: &base_archlinux_env TERM: xterm MAKEFLAGS: -j 3 + CPUs: 3 - base_archlinux_large: &base_archlinux_large <<: *base_archlinux @@ -373,6 +374,7 @@ defaults: environment: &base_archlinux_large_env <<: *base_archlinux_env MAKEFLAGS: -j 5 + CPUs: 5 - base_cimg_small: &base_cimg_small docker: @@ -381,6 +383,7 @@ defaults: environment: &base_cimg_small_env TERM: xterm MAKEFLAGS: -j 2 + CPUs: 2 - base_ems_large: &base_ems_large docker: @@ -389,6 +392,7 @@ defaults: environment: &base_ems_large_env TERM: xterm MAKEFLAGS: -j 5 + CPUs: 5 - base_node_small: &base_node_small docker: @@ -397,6 +401,7 @@ defaults: environment: &base_node_small_env TERM: xterm MAKEFLAGS: -j 2 + CPUs: 2 - base_osx: &base_osx macos: @@ -405,6 +410,7 @@ defaults: environment: &base_osx_env TERM: xterm MAKEFLAGS: -j5 + CPUs: 5 - base_osx_large: &base_osx_large <<: *base_osx @@ -412,6 +418,7 @@ defaults: environment: &base_osx_large_env <<: *base_osx_env MAKEFLAGS: -j10 + CPUs: 10 - base_python_small: &base_python_small docker: @@ -420,6 +427,7 @@ defaults: environment: &base_python_small_env TERM: xterm MAKEFLAGS: -j 2 + CPUs: 2 - base_ubuntu_clang: &base_ubuntu_clang docker: @@ -427,6 +435,7 @@ defaults: environment: &base_ubuntu_clang_env TERM: xterm MAKEFLAGS: -j 3 + CPUs: 3 - base_ubuntu_clang_small: &base_ubuntu_clang_small <<: *base_ubuntu_clang @@ -434,6 +443,7 @@ defaults: environment: &base_ubuntu_clang_small_env <<: *base_ubuntu_clang_env MAKEFLAGS: -j 2 + CPUs: 2 - base_ubuntu2004: &base_ubuntu2004 docker: @@ -441,6 +451,7 @@ defaults: environment: &base_ubuntu2004_env TERM: xterm MAKEFLAGS: -j 3 + CPUs: 3 - base_ubuntu2004_small: &base_ubuntu2004_small <<: *base_ubuntu2004 @@ -448,6 +459,7 @@ defaults: environment: &base_ubuntu2004_small_env <<: *base_ubuntu2004_env MAKEFLAGS: -j 2 + CPUs: 2 - base_ubuntu2004_xlarge: &base_ubuntu2004_xlarge <<: *base_ubuntu2004 @@ -455,6 +467,7 @@ defaults: environment: &base_ubuntu2004_xlarge_env <<: *base_ubuntu2004_env MAKEFLAGS: -j 10 + CPUs: 10 - base_ubuntu2204: &base_ubuntu2204 docker: @@ -462,6 +475,7 @@ defaults: environment: &base_ubuntu2204_env TERM: xterm MAKEFLAGS: -j 3 + CPUs: 3 - base_ubuntu2204_clang: &base_ubuntu2204_clang docker: @@ -471,6 +485,7 @@ defaults: CC: clang CXX: clang++ MAKEFLAGS: -j 3 + CPUs: 3 - base_ubuntu2204_clang_large: &base_ubuntu2204_clang_large <<: *base_ubuntu2204_clang @@ -478,6 +493,7 @@ defaults: environment: &base_ubuntu2204_clang_large_env <<: *base_ubuntu2204_clang_env MAKEFLAGS: -j 5 + CPUs: 5 - base_ubuntu2204_small: &base_ubuntu2204_small <<: *base_ubuntu2204 @@ -485,6 +501,7 @@ defaults: environment: &base_ubuntu2204_small_env <<: *base_ubuntu2204_env MAKEFLAGS: -j 2 + CPUs: 2 - base_ubuntu2204_large: &base_ubuntu2204_large <<: *base_ubuntu2204 @@ -492,6 +509,7 @@ defaults: environment: &base_ubuntu2204_large_env <<: *base_ubuntu2204_env MAKEFLAGS: -j 5 + CPUs: 5 - base_ubuntu2204_xlarge: &base_ubuntu2204_xlarge <<: *base_ubuntu2204 @@ -499,6 +517,7 @@ defaults: environment: &base_ubuntu2204_xlarge_env <<: *base_ubuntu2204_env MAKEFLAGS: -j 10 + CPUs: 10 - base_win: &base_win executor: diff --git a/.circleci/soltest.sh b/.circleci/soltest.sh index e350aa23d710..488201bae3ff 100755 --- a/.circleci/soltest.sh +++ b/.circleci/soltest.sh @@ -36,6 +36,7 @@ set -e OPTIMIZE=${OPTIMIZE:-"0"} EVM=${EVM:-"invalid"} +CPUs=${CPUs:-3} REPODIR="$(realpath "$(dirname "$0")/..")" IFS=" " read -r -a BOOST_TEST_ARGS <<< "$BOOST_TEST_ARGS" @@ -67,7 +68,6 @@ get_logfile_basename() { # long-running test cases are next to each other. CIRCLE_NODE_INDEX=$(((CIRCLE_NODE_INDEX + 23 * INDEX_SHIFT) % CIRCLE_NODE_TOTAL)) -CPUs=3 PIDs=() for run in $(seq 0 $((CPUs - 1))) do From b7d2c8bb0ae4d0de0b83aed4bd4ebaf9ff3094da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 8 Aug 2023 16:11:57 +0200 Subject: [PATCH 028/150] SourceReferenceFormatter: Line wrapping and unused includes --- liblangutil/SourceReferenceFormatter.h | 5 ++++- libsolidity/codegen/ir/IRGenerator.cpp | 2 -- test/libsolidity/GasTest.cpp | 1 - test/libyul/Common.cpp | 1 - test/libyul/ControlFlowGraphTest.cpp | 1 - tools/yulPhaser/Program.cpp | 1 - 6 files changed, 4 insertions(+), 7 deletions(-) diff --git a/liblangutil/SourceReferenceFormatter.h b/liblangutil/SourceReferenceFormatter.h index def216efa16d..c072e72e246b 100644 --- a/liblangutil/SourceReferenceFormatter.h +++ b/liblangutil/SourceReferenceFormatter.h @@ -46,7 +46,10 @@ class SourceReferenceFormatter bool _colored, bool _withErrorIds ): - m_stream(_stream), m_charStreamProvider(_charStreamProvider), m_colored(_colored), m_withErrorIds(_withErrorIds) + m_stream(_stream), + m_charStreamProvider(_charStreamProvider), + m_colored(_colored), + m_withErrorIds(_withErrorIds) {} /// Prints source location if it is given. diff --git a/libsolidity/codegen/ir/IRGenerator.cpp b/libsolidity/codegen/ir/IRGenerator.cpp index 223d712f0ded..67adb61bbff3 100644 --- a/libsolidity/codegen/ir/IRGenerator.cpp +++ b/libsolidity/codegen/ir/IRGenerator.cpp @@ -38,8 +38,6 @@ #include #include -#include - #include #include diff --git a/test/libsolidity/GasTest.cpp b/test/libsolidity/GasTest.cpp index 78a0ca907f65..0060c81e4081 100644 --- a/test/libsolidity/GasTest.cpp +++ b/test/libsolidity/GasTest.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/test/libyul/Common.cpp b/test/libyul/Common.cpp index 800684f35376..f10414a9f7a1 100644 --- a/test/libyul/Common.cpp +++ b/test/libyul/Common.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include diff --git a/test/libyul/ControlFlowGraphTest.cpp b/test/libyul/ControlFlowGraphTest.cpp index dffc7ecbfd95..44fff4219fb4 100644 --- a/test/libyul/ControlFlowGraphTest.cpp +++ b/test/libyul/ControlFlowGraphTest.cpp @@ -24,7 +24,6 @@ #include #include #include -#include #include #include diff --git a/tools/yulPhaser/Program.cpp b/tools/yulPhaser/Program.cpp index c62b8e13030a..3089591ed8ba 100644 --- a/tools/yulPhaser/Program.cpp +++ b/tools/yulPhaser/Program.cpp @@ -20,7 +20,6 @@ #include #include -#include #include #include From 8407c8c615c39236db6c29d6c4f8ccbf071ee334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 8 Aug 2023 17:08:37 +0200 Subject: [PATCH 029/150] SourceReferenceFormatter: Support full range of options in formatErrorInformation() --- liblangutil/SourceReferenceFormatter.h | 26 ++++++++++++++----- libsolidity/interface/CompilerStack.cpp | 17 +++++------- test/libsolidity/InlineAssembly.cpp | 10 +++---- .../tools/ossfuzz/SolidityEvmoneInterface.cpp | 9 +++---- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/liblangutil/SourceReferenceFormatter.h b/liblangutil/SourceReferenceFormatter.h index c072e72e246b..02a38288aade 100644 --- a/liblangutil/SourceReferenceFormatter.h +++ b/liblangutil/SourceReferenceFormatter.h @@ -90,14 +90,28 @@ class SourceReferenceFormatter static std::string formatErrorInformation( Error const& _error, - CharStreamProvider const& _charStreamProvider + CharStreamProvider const& _charStreamProvider, + bool _colored = false, + bool _withErrorIds = false ) { - return formatExceptionInformation( - _error, - Error::errorSeverity(_error.type()), - _charStreamProvider - ); + std::ostringstream errorOutput; + SourceReferenceFormatter formatter(errorOutput, _charStreamProvider, _colored, _withErrorIds); + formatter.printErrorInformation(_error); + return errorOutput.str(); + } + + static std::string formatErrorInformation( + langutil::ErrorList const& _errors, + CharStreamProvider const& _charStreamProvider, + bool _colored = false, + bool _withErrorIds = false + ) + { + std::ostringstream errorOutput; + SourceReferenceFormatter formatter(errorOutput, _charStreamProvider, _colored, _withErrorIds); + formatter.printErrorInformation(_errors); + return errorOutput.str(); } static std::string formatErrorInformation(Error const& _error, CharStream const& _charStream); diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index bbebc25085cc..84f886d721f9 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -1486,16 +1486,13 @@ void CompilerStack::generateIR(ContractDefinition const& _contract) m_optimiserSettings, m_debugInfoSelection ); - if (!stack.parseAndAnalyze("", compiledContract.yulIR)) - { - string errorMessage; - for (auto const& error: stack.errors()) - errorMessage += langutil::SourceReferenceFormatter::formatErrorInformation( - *error, - stack.charStream("") - ); - solAssert(false, compiledContract.yulIR + "\n\nInvalid IR generated:\n" + errorMessage + "\n"); - } + bool yulAnalysisSuccessful = stack.parseAndAnalyze("", compiledContract.yulIR); + solAssert( + yulAnalysisSuccessful, + compiledContract.yulIR + "\n\n" + "Invalid IR generated:\n" + + langutil::SourceReferenceFormatter::formatErrorInformation(stack.errors(), stack) + "\n" + ); compiledContract.yulIRAst = stack.astJson(); stack.optimize(); diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp index 4a8a9d617274..d59b843ddb3b 100644 --- a/test/libsolidity/InlineAssembly.cpp +++ b/test/libsolidity/InlineAssembly.cpp @@ -85,12 +85,10 @@ std::optional parseAndReturnFirstError( if (_allowWarnings && e->type() == Error::Type::Warning) continue; if (error) - { - string errors; - for (auto const& err: stack.errors()) - errors += SourceReferenceFormatter::formatErrorInformation(*err, stack); - BOOST_FAIL("Found more than one error:\n" + errors); - } + BOOST_FAIL( + "Found more than one error:\n" + + SourceReferenceFormatter::formatErrorInformation(stack.errors(), stack) + ); error = e; } if (!success) diff --git a/test/tools/ossfuzz/SolidityEvmoneInterface.cpp b/test/tools/ossfuzz/SolidityEvmoneInterface.cpp index d2d18bcf5e73..34147090882c 100644 --- a/test/tools/ossfuzz/SolidityEvmoneInterface.cpp +++ b/test/tools/ossfuzz/SolidityEvmoneInterface.cpp @@ -42,11 +42,10 @@ optional SolidityCompilationFramework::compileContract() if (m_compilerInput.debugFailure) { cerr << "Compiling contract failed" << endl; - for (auto const& error: m_compiler.errors()) - cerr << SourceReferenceFormatter::formatErrorInformation( - *error, - m_compiler - ); + cerr << SourceReferenceFormatter::formatErrorInformation( + m_compiler.errors(), + m_compiler + ); } return {}; } From 4020552e1d7146ae0373092a3d04c86d40db2b27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 8 Aug 2023 17:54:05 +0200 Subject: [PATCH 030/150] SourceReferenceFormatter: Remove the ineffective _withErrorIds parameter from formatExceptionInformation() --- liblangutil/SourceReferenceFormatter.h | 10 ++++------ libsolidity/interface/StandardCompiler.cpp | 3 +-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/liblangutil/SourceReferenceFormatter.h b/liblangutil/SourceReferenceFormatter.h index 02a38288aade..8d3121a7a8f7 100644 --- a/liblangutil/SourceReferenceFormatter.h +++ b/liblangutil/SourceReferenceFormatter.h @@ -64,12 +64,11 @@ class SourceReferenceFormatter util::Exception const& _exception, Error::Type _type, CharStreamProvider const& _charStreamProvider, - bool _colored = false, - bool _withErrorIds = false + bool _colored = false ) { std::ostringstream errorOutput; - SourceReferenceFormatter formatter(errorOutput, _charStreamProvider, _colored, _withErrorIds); + SourceReferenceFormatter formatter(errorOutput, _charStreamProvider, _colored, false /* _withErrorIds */); formatter.printExceptionInformation(_exception, _type); return errorOutput.str(); } @@ -78,12 +77,11 @@ class SourceReferenceFormatter util::Exception const& _exception, Error::Severity _severity, CharStreamProvider const& _charStreamProvider, - bool _colored = false, - bool _withErrorIds = false + bool _colored = false ) { std::ostringstream errorOutput; - SourceReferenceFormatter formatter(errorOutput, _charStreamProvider, _colored, _withErrorIds); + SourceReferenceFormatter formatter(errorOutput, _charStreamProvider, _colored, false /* _withErrorIds */); formatter.printExceptionInformation(_exception, _severity); return errorOutput.str(); } diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index 767792601bd5..32d6cf8e8be8 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -125,8 +125,7 @@ Json::Value formatErrorWithException( _exception, _type, _charStreamProvider, - false, // colored - false // _withErrorIds + false // colored ); if (string const* description = _exception.comment()) From a59fc39f101449587bad937a92c0c9802c7d6438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 8 Aug 2023 17:17:37 +0200 Subject: [PATCH 031/150] Use printErrorInformation() over printExceptionInformation() where possible --- liblangutil/SourceReferenceFormatter.h | 4 ++++ solc/CommandLineInterface.cpp | 2 +- test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp | 5 +---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/liblangutil/SourceReferenceFormatter.h b/liblangutil/SourceReferenceFormatter.h index 8d3121a7a8f7..91f1d7ddd04d 100644 --- a/liblangutil/SourceReferenceFormatter.h +++ b/liblangutil/SourceReferenceFormatter.h @@ -52,6 +52,10 @@ class SourceReferenceFormatter m_withErrorIds(_withErrorIds) {} + // WARNING: Use the xyzErrorInformation() variants over xyzExceptionInformation() when you + // do have access to an Error instance. Error is implicitly convertible to util::Exception + // but the conversion loses the error ID. + /// Prints source location if it is given. void printSourceLocation(SourceReference const& _ref); void printExceptionInformation(SourceReferenceExtractor::Message const& _msg); diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 7a28900b3203..509279a71542 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -827,7 +827,7 @@ void CommandLineInterface::compile() else { m_hasOutput = true; - formatter.printExceptionInformation(_error, Error::errorSeverity(_error.type())); + formatter.printErrorInformation(_error); solThrow(CommandLineExecutionError, ""); } } diff --git a/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp b/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp index b1725a8fa80c..d1717a159a5e 100644 --- a/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp +++ b/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp @@ -77,10 +77,7 @@ DEFINE_PROTO_FUZZER(Program const& _input) Error::containsErrors(stack.errors()) ) { - SourceReferenceFormatter formatter(std::cout, stack, false, false); - - for (auto const& error: stack.errors()) - formatter.printExceptionInformation(*error, Error::errorSeverity(error->type())); + SourceReferenceFormatter{std::cout, stack, false, false}.printErrorInformation(stack.errors()); yulAssert(false, "Proto fuzzer generated malformed program"); } From 339053f185253fd50f3476dc75a57fd958544bcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 8 Aug 2023 17:19:43 +0200 Subject: [PATCH 032/150] AnalysisFramework.formatErrors(): Fix _withErrorIds flag not having any effect --- test/libsolidity/AnalysisFramework.cpp | 15 ++++++++------- test/libsolidity/AnalysisFramework.h | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/test/libsolidity/AnalysisFramework.cpp b/test/libsolidity/AnalysisFramework.cpp index dc1e4fbcfc0c..6c6ad0cb8649 100644 --- a/test/libsolidity/AnalysisFramework.cpp +++ b/test/libsolidity/AnalysisFramework.cpp @@ -147,15 +147,17 @@ ErrorList AnalysisFramework::expectError(std::string const& _source, bool _warni } string AnalysisFramework::formatErrors( - langutil::ErrorList _errors, + langutil::ErrorList const& _errors, bool _colored, bool _withErrorIds ) const { - string message; - for (auto const& error: _errors) - message += formatError(*error, _colored, _withErrorIds); - return message; + return SourceReferenceFormatter::formatErrorInformation( + _errors, + *m_compiler, + _colored, + _withErrorIds + ); } string AnalysisFramework::formatError( @@ -164,9 +166,8 @@ string AnalysisFramework::formatError( bool _withErrorIds ) const { - return SourceReferenceFormatter::formatExceptionInformation( + return SourceReferenceFormatter::formatErrorInformation( _error, - _error.type(), *m_compiler, _colored, _withErrorIds diff --git a/test/libsolidity/AnalysisFramework.h b/test/libsolidity/AnalysisFramework.h index 2e5d00e1da43..d36884390ade 100644 --- a/test/libsolidity/AnalysisFramework.h +++ b/test/libsolidity/AnalysisFramework.h @@ -58,7 +58,7 @@ class AnalysisFramework langutil::ErrorList expectError(std::string const& _source, bool _warning = false, bool _allowMultiple = false); std::string formatErrors( - langutil::ErrorList _errors, + langutil::ErrorList const& _errors, bool _colored = false, bool _withErrorIds = false ) const; From de1a017ccb935d149ed6bcbdb730d89883f8ce02 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Mon, 14 Aug 2023 10:37:11 +0200 Subject: [PATCH 033/150] Purge using namespace std from libsolidity/analysis --- libsolidity/analysis/ConstantEvaluator.cpp | 89 ++++++------ libsolidity/analysis/ContractLevelChecker.cpp | 33 ++--- libsolidity/analysis/ControlFlowAnalyzer.cpp | 19 ++- libsolidity/analysis/ControlFlowBuilder.cpp | 6 +- libsolidity/analysis/ControlFlowGraph.cpp | 1 - libsolidity/analysis/DeclarationContainer.cpp | 21 ++- .../analysis/DeclarationTypeChecker.cpp | 15 +- libsolidity/analysis/DocStringAnalyser.cpp | 15 +- libsolidity/analysis/DocStringTagParser.cpp | 39 +++-- libsolidity/analysis/FunctionCallGraph.cpp | 33 ++--- libsolidity/analysis/GlobalContext.cpp | 16 +- libsolidity/analysis/NameAndTypeResolver.cpp | 63 ++++---- libsolidity/analysis/OverrideChecker.cpp | 85 ++++++----- libsolidity/analysis/PostTypeChecker.cpp | 15 +- .../analysis/PostTypeContractLevelChecker.cpp | 5 +- libsolidity/analysis/ReferencesResolver.cpp | 23 ++- libsolidity/analysis/Scoper.cpp | 1 - libsolidity/analysis/StaticAnalyzer.cpp | 17 +-- libsolidity/analysis/SyntaxChecker.cpp | 35 +++-- libsolidity/analysis/TypeChecker.cpp | 137 +++++++++--------- libsolidity/analysis/ViewPureChecker.cpp | 15 +- scripts/check_style.sh | 1 + 22 files changed, 331 insertions(+), 353 deletions(-) diff --git a/libsolidity/analysis/ConstantEvaluator.cpp b/libsolidity/analysis/ConstantEvaluator.cpp index 7fde36ec0ebb..8e18183a81f9 100644 --- a/libsolidity/analysis/ConstantEvaluator.cpp +++ b/libsolidity/analysis/ConstantEvaluator.cpp @@ -29,7 +29,6 @@ #include -using namespace std; using namespace solidity; using namespace solidity::frontend; using namespace solidity::langutil; @@ -47,9 +46,9 @@ bool fitsPrecisionExp(bigint const& _base, bigint const& _exp) solAssert(_base > 0, ""); - size_t const bitsMax = 4096; + std::size_t const bitsMax = 4096; - size_t mostSignificantBaseBit = static_cast(boost::multiprecision::msb(_base)); + std::size_t mostSignificantBaseBit = static_cast(boost::multiprecision::msb(_base)); if (mostSignificantBaseBit == 0) // _base == 1 return true; if (mostSignificantBaseBit > bitsMax) // _base >= 2 ^ 4096 @@ -68,7 +67,7 @@ bool fitsPrecisionBase2(bigint const& _mantissa, uint32_t _expBase2) } -optional ConstantEvaluator::evaluateBinaryOperator(Token _operator, rational const& _left, rational const& _right) +std::optional ConstantEvaluator::evaluateBinaryOperator(Token _operator, rational const& _left, rational const& _right) { bool fractional = _left.denominator() != 1 || _right.denominator() != 1; switch (_operator) @@ -76,17 +75,17 @@ optional ConstantEvaluator::evaluateBinaryOperator(Token _operator, ra //bit operations will only be enabled for integers and fixed types that resemble integers case Token::BitOr: if (fractional) - return nullopt; + return std::nullopt; else return _left.numerator() | _right.numerator(); case Token::BitXor: if (fractional) - return nullopt; + return std::nullopt; else return _left.numerator() ^ _right.numerator(); case Token::BitAnd: if (fractional) - return nullopt; + return std::nullopt; else return _left.numerator() & _right.numerator(); case Token::Add: return _left + _right; @@ -94,12 +93,12 @@ optional ConstantEvaluator::evaluateBinaryOperator(Token _operator, ra case Token::Mul: return _left * _right; case Token::Div: if (_right == rational(0)) - return nullopt; + return std::nullopt; else return _left / _right; case Token::Mod: if (_right == rational(0)) - return nullopt; + return std::nullopt; else if (fractional) { rational tempValue = _left / _right; @@ -111,7 +110,7 @@ optional ConstantEvaluator::evaluateBinaryOperator(Token _operator, ra case Token::Exp: { if (_right.denominator() != 1) - return nullopt; + return std::nullopt; bigint const& exp = _right.numerator(); // x ** 0 = 1 @@ -127,13 +126,13 @@ optional ConstantEvaluator::evaluateBinaryOperator(Token _operator, ra } else { - if (abs(exp) > numeric_limits::max()) - return nullopt; // This will need too much memory to represent. + if (abs(exp) > std::numeric_limits::max()) + return std::nullopt; // This will need too much memory to represent. uint32_t absExp = bigint(abs(exp)).convert_to(); if (!fitsPrecisionExp(abs(_left.numerator()), absExp) || !fitsPrecisionExp(abs(_left.denominator()), absExp)) - return nullopt; + return std::nullopt; static auto const optimizedPow = [](bigint const& _base, uint32_t _exponent) -> bigint { if (_base == 1) @@ -158,18 +157,18 @@ optional ConstantEvaluator::evaluateBinaryOperator(Token _operator, ra case Token::SHL: { if (fractional) - return nullopt; + return std::nullopt; else if (_right < 0) - return nullopt; - else if (_right > numeric_limits::max()) - return nullopt; + return std::nullopt; + else if (_right > std::numeric_limits::max()) + return std::nullopt; if (_left.numerator() == 0) return 0; else { uint32_t exponent = _right.numerator().convert_to(); if (!fitsPrecisionBase2(abs(_left.numerator()), exponent)) - return nullopt; + return std::nullopt; return _left.numerator() * boost::multiprecision::pow(bigint(2), exponent); } break; @@ -179,11 +178,11 @@ optional ConstantEvaluator::evaluateBinaryOperator(Token _operator, ra case Token::SAR: { if (fractional) - return nullopt; + return std::nullopt; else if (_right < 0) - return nullopt; - else if (_right > numeric_limits::max()) - return nullopt; + return std::nullopt; + else if (_right > std::numeric_limits::max()) + return std::nullopt; if (_left.numerator() == 0) return 0; else @@ -209,60 +208,60 @@ optional ConstantEvaluator::evaluateBinaryOperator(Token _operator, ra break; } default: - return nullopt; + return std::nullopt; } } -optional ConstantEvaluator::evaluateUnaryOperator(Token _operator, rational const& _input) +std::optional ConstantEvaluator::evaluateUnaryOperator(Token _operator, rational const& _input) { switch (_operator) { case Token::BitNot: if (_input.denominator() != 1) - return nullopt; + return std::nullopt; else return ~_input.numerator(); case Token::Sub: return -_input; default: - return nullopt; + return std::nullopt; } } namespace { -optional convertType(rational const& _value, Type const& _type) +std::optional convertType(rational const& _value, Type const& _type) { if (_type.category() == Type::Category::RationalNumber) return TypedRational{TypeProvider::rationalNumber(_value), _value}; else if (auto const* integerType = dynamic_cast(&_type)) { if (_value > integerType->maxValue() || _value < integerType->minValue()) - return nullopt; + return std::nullopt; else return TypedRational{&_type, _value.numerator() / _value.denominator()}; } else - return nullopt; + return std::nullopt; } -optional convertType(optional const& _value, Type const& _type) +std::optional convertType(std::optional const& _value, Type const& _type) { - return _value ? convertType(_value->value, _type) : nullopt; + return _value ? convertType(_value->value, _type) : std::nullopt; } -optional constantToTypedValue(Type const& _type) +std::optional constantToTypedValue(Type const& _type) { if (_type.category() == Type::Category::RationalNumber) return TypedRational{&_type, dynamic_cast(_type).value()}; else - return nullopt; + return std::nullopt; } } -optional ConstantEvaluator::evaluate( +std::optional ConstantEvaluator::evaluate( langutil::ErrorReporter& _errorReporter, Expression const& _expr ) @@ -271,7 +270,7 @@ optional ConstantEvaluator::evaluate( } -optional ConstantEvaluator::evaluate(ASTNode const& _node) +std::optional ConstantEvaluator::evaluate(ASTNode const& _node) { if (!m_values.count(&_node)) { @@ -280,7 +279,7 @@ optional ConstantEvaluator::evaluate(ASTNode const& _node) solAssert(varDecl->isConstant(), ""); // In some circumstances, we do not yet have a type for the variable. if (!varDecl->value() || !varDecl->type()) - m_values[&_node] = nullopt; + m_values[&_node] = std::nullopt; else { m_depth++; @@ -298,7 +297,7 @@ optional ConstantEvaluator::evaluate(ASTNode const& _node) { expression->accept(*this); if (!m_values.count(&_node)) - m_values[&_node] = nullopt; + m_values[&_node] = std::nullopt; } } return m_values.at(&_node); @@ -306,7 +305,7 @@ optional ConstantEvaluator::evaluate(ASTNode const& _node) void ConstantEvaluator::endVisit(UnaryOperation const& _operation) { - optional value = evaluate(_operation.subExpression()); + std::optional value = evaluate(_operation.subExpression()); if (!value) return; @@ -317,9 +316,9 @@ void ConstantEvaluator::endVisit(UnaryOperation const& _operation) if (!value) return; - if (optional result = evaluateUnaryOperator(_operation.getOperator(), value->value)) + if (std::optional result = evaluateUnaryOperator(_operation.getOperator(), value->value)) { - optional convertedValue = convertType(*result, *resultType); + std::optional convertedValue = convertType(*result, *resultType); if (!convertedValue) m_errorReporter.fatalTypeError( 3667_error, @@ -332,8 +331,8 @@ void ConstantEvaluator::endVisit(UnaryOperation const& _operation) void ConstantEvaluator::endVisit(BinaryOperation const& _operation) { - optional left = evaluate(_operation.leftExpression()); - optional right = evaluate(_operation.rightExpression()); + std::optional left = evaluate(_operation.leftExpression()); + std::optional right = evaluate(_operation.rightExpression()); if (!left || !right) return; @@ -349,7 +348,7 @@ void ConstantEvaluator::endVisit(BinaryOperation const& _operation) 6020_error, _operation.location(), "Operator " + - string(TokenTraits::toString(_operation.getOperator())) + + std::string(TokenTraits::toString(_operation.getOperator())) + " not compatible with types " + left->type->toString() + " and " + @@ -363,9 +362,9 @@ void ConstantEvaluator::endVisit(BinaryOperation const& _operation) if (!left || !right) return; - if (optional value = evaluateBinaryOperator(_operation.getOperator(), left->value, right->value)) + if (std::optional value = evaluateBinaryOperator(_operation.getOperator(), left->value, right->value)) { - optional convertedValue = convertType(*value, *resultType); + std::optional convertedValue = convertType(*value, *resultType); if (!convertedValue) m_errorReporter.fatalTypeError( 2643_error, diff --git a/libsolidity/analysis/ContractLevelChecker.cpp b/libsolidity/analysis/ContractLevelChecker.cpp index e7e7041a0ff1..eaeaf4851710 100644 --- a/libsolidity/analysis/ContractLevelChecker.cpp +++ b/libsolidity/analysis/ContractLevelChecker.cpp @@ -32,7 +32,6 @@ #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; @@ -49,10 +48,10 @@ bool hasEqualExternalCallableParameters(T const& _a, B const& _b) } template -map> filterDeclarations( - map> const& _declarations) +std::map> filterDeclarations( + std::map> const& _declarations) { - map> filteredDeclarations; + std::map> filteredDeclarations; for (auto const& [name, overloads]: _declarations) for (auto const* declaration: overloads) if (auto typedDeclaration = dynamic_cast(declaration)) @@ -106,7 +105,7 @@ void ContractLevelChecker::checkDuplicateFunctions(ContractDefinition const& _co { /// Checks that two functions with the same name defined in this contract have different /// argument types and that there is at most one constructor. - map> functions; + std::map> functions; FunctionDefinition const* constructor = nullptr; FunctionDefinition const* fallback = nullptr; FunctionDefinition const* receive = nullptr; @@ -157,7 +156,7 @@ void ContractLevelChecker::checkDuplicateEvents(ContractDefinition const& _contr { /// Checks that two events with the same name defined in this contract have different /// argument types - map> events; + std::map> events; for (auto const* contract: _contract.annotation().linearizedBaseContracts) for (EventDefinition const* event: contract->events()) events[event->name()].push_back(event); @@ -195,12 +194,12 @@ void ContractLevelChecker::checkReceiveFunction(ContractDefinition const& _contr } template -void ContractLevelChecker::findDuplicateDefinitions(map> const& _definitions) +void ContractLevelChecker::findDuplicateDefinitions(std::map> const& _definitions) { for (auto const& it: _definitions) { - vector const& overloads = it.second; - set reported; + std::vector const& overloads = it.second; + std::set reported; for (size_t i = 0; i < overloads.size() && !reported.count(i); ++i) { SecondarySourceLocation ssl; @@ -228,15 +227,15 @@ void ContractLevelChecker::findDuplicateDefinitions(map> const if (ssl.infos.size() > 0) { ErrorId error; - string message; - if constexpr (is_same_v) + std::string message; + if constexpr (std::is_same_v) { error = 1686_error; message = "Function with same name and parameter types defined twice."; } else { - static_assert(is_same_v, "Expected \"FunctionDefinition const*\" or \"EventDefinition const*\""); + static_assert(std::is_same_v, "Expected \"FunctionDefinition const*\" or \"EventDefinition const*\""); error = 5883_error; message = "Event with same name and parameter types defined twice."; } @@ -258,7 +257,7 @@ void ContractLevelChecker::checkAbstractDefinitions(ContractDefinition const& _c { // Collects functions, static variable getters and modifiers. If they // override (unimplemented) base class ones, they are replaced. - set proxies; + std::set proxies; auto registerProxy = [&proxies](OverrideProxy const& _overrideProxy) { @@ -323,7 +322,7 @@ void ContractLevelChecker::checkAbstractDefinitions(ContractDefinition const& _c void ContractLevelChecker::checkBaseConstructorArguments(ContractDefinition const& _contract) { - vector const& bases = _contract.annotation().linearizedBaseContracts; + std::vector const& bases = _contract.annotation().linearizedBaseContracts; // Determine the arguments that are used for the base constructors. for (ContractDefinition const* contract: bases) @@ -430,7 +429,7 @@ void ContractLevelChecker::annotateBaseConstructorArguments( void ContractLevelChecker::checkExternalTypeClashes(ContractDefinition const& _contract) { - map>> externalDeclarations; + std::map>> externalDeclarations; for (ContractDefinition const* contract: _contract.annotation().linearizedBaseContracts) { for (FunctionDefinition const* f: contract->definedFunctions()) @@ -467,7 +466,7 @@ void ContractLevelChecker::checkExternalTypeClashes(ContractDefinition const& _c void ContractLevelChecker::checkHashCollisions(ContractDefinition const& _contract) { - set> hashes; + std::set> hashes; for (auto const& it: _contract.interfaceFunctionList()) { util::FixedHash<4> const& hash = it.first; @@ -475,7 +474,7 @@ void ContractLevelChecker::checkHashCollisions(ContractDefinition const& _contra m_errorReporter.fatalTypeError( 1860_error, _contract.location(), - string("Function signature hash collision for ") + it.second->externalSignature() + std::string("Function signature hash collision for ") + it.second->externalSignature() ); hashes.insert(hash); } diff --git a/libsolidity/analysis/ControlFlowAnalyzer.cpp b/libsolidity/analysis/ControlFlowAnalyzer.cpp index e80964acebab..7ae1aa76e2b9 100644 --- a/libsolidity/analysis/ControlFlowAnalyzer.cpp +++ b/libsolidity/analysis/ControlFlowAnalyzer.cpp @@ -25,7 +25,6 @@ #include -using namespace std; using namespace std::placeholders; using namespace solidity::langutil; using namespace solidity::frontend; @@ -44,7 +43,7 @@ void ControlFlowAnalyzer::analyze(FunctionDefinition const& _function, ContractD if (!_function.isImplemented()) return; - optional mostDerivedContractName; + std::optional mostDerivedContractName; // The name of the most derived contract only required if it differs from // the functions contract @@ -61,13 +60,13 @@ void ControlFlowAnalyzer::analyze(FunctionDefinition const& _function, ContractD } -void ControlFlowAnalyzer::checkUninitializedAccess(CFGNode const* _entry, CFGNode const* _exit, bool _emptyBody, optional _contractName) +void ControlFlowAnalyzer::checkUninitializedAccess(CFGNode const* _entry, CFGNode const* _exit, bool _emptyBody, std::optional _contractName) { struct NodeInfo { - set unassignedVariablesAtEntry; - set unassignedVariablesAtExit; - set uninitializedVariableAccesses; + std::set unassignedVariablesAtEntry; + std::set unassignedVariablesAtExit; + std::set uninitializedVariableAccesses; /// Propagate the information from another node to this node. /// To be used to propagate information from a node to its exit nodes. /// Returns true, if new variables were added and thus the current node has @@ -84,8 +83,8 @@ void ControlFlowAnalyzer::checkUninitializedAccess(CFGNode const* _entry, CFGNod ; } }; - map nodeInfos; - set nodesToTraverse; + std::map nodeInfos; + std::set nodesToTraverse; nodesToTraverse.insert(_entry); // Walk all paths starting from the nodes in ``nodesToTraverse`` until ``NodeInfo::propagateFrom`` @@ -138,7 +137,7 @@ void ControlFlowAnalyzer::checkUninitializedAccess(CFGNode const* _entry, CFGNod auto const& exitInfo = nodeInfos[_exit]; if (!exitInfo.uninitializedVariableAccesses.empty()) { - vector uninitializedAccessesOrdered( + std::vector uninitializedAccessesOrdered( exitInfo.uninitializedVariableAccesses.begin(), exitInfo.uninitializedVariableAccesses.end() ); @@ -168,7 +167,7 @@ void ControlFlowAnalyzer::checkUninitializedAccess(CFGNode const* _entry, CFGNod varDecl.location(), ssl, "This variable is of " + - string(isStorage ? "storage" : "calldata") + + std::string(isStorage ? "storage" : "calldata") + " pointer type and can be " + (variableOccurrence->kind() == VariableOccurrence::Kind::Return ? "returned" : "accessed") + " without prior assignment, which would lead to undefined behaviour." diff --git a/libsolidity/analysis/ControlFlowBuilder.cpp b/libsolidity/analysis/ControlFlowBuilder.cpp index 1f2cfcac9dd5..c20968a14d79 100644 --- a/libsolidity/analysis/ControlFlowBuilder.cpp +++ b/libsolidity/analysis/ControlFlowBuilder.cpp @@ -21,10 +21,8 @@ #include #include -using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; -using namespace std; ControlFlowBuilder::ControlFlowBuilder(CFG::NodeContainer& _nodeContainer, FunctionFlow const& _functionFlow, ContractDefinition const* _contract): m_nodeContainer(_nodeContainer), @@ -37,13 +35,13 @@ ControlFlowBuilder::ControlFlowBuilder(CFG::NodeContainer& _nodeContainer, Funct } -unique_ptr ControlFlowBuilder::createFunctionFlow( +std::unique_ptr ControlFlowBuilder::createFunctionFlow( CFG::NodeContainer& _nodeContainer, FunctionDefinition const& _function, ContractDefinition const* _contract ) { - auto functionFlow = make_unique(); + auto functionFlow = std::make_unique(); functionFlow->entry = _nodeContainer.newNode(); functionFlow->exit = _nodeContainer.newNode(); functionFlow->revert = _nodeContainer.newNode(); diff --git a/libsolidity/analysis/ControlFlowGraph.cpp b/libsolidity/analysis/ControlFlowGraph.cpp index 71acb8a672f0..518743ef1993 100644 --- a/libsolidity/analysis/ControlFlowGraph.cpp +++ b/libsolidity/analysis/ControlFlowGraph.cpp @@ -20,7 +20,6 @@ #include -using namespace std; using namespace solidity::langutil; using namespace solidity::frontend; diff --git a/libsolidity/analysis/DeclarationContainer.cpp b/libsolidity/analysis/DeclarationContainer.cpp index b6cd3eef01ba..df6e664baca1 100644 --- a/libsolidity/analysis/DeclarationContainer.cpp +++ b/libsolidity/analysis/DeclarationContainer.cpp @@ -29,7 +29,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::frontend; @@ -41,7 +40,7 @@ Declaration const* DeclarationContainer::conflictingDeclaration( if (!_name) _name = &_declaration.name(); solAssert(!_name->empty(), ""); - vector declarations; + std::vector declarations; if (m_declarations.count(*_name)) declarations += m_declarations.at(*_name); if (m_invisibleDeclarations.count(*_name)) @@ -127,7 +126,7 @@ bool DeclarationContainer::registerDeclaration( m_homonymCandidates.emplace_back(*_name, _location ? _location : &_declaration.location()); } - vector& decls = _invisible ? m_invisibleDeclarations[*_name] : m_declarations[*_name]; + std::vector& decls = _invisible ? m_invisibleDeclarations[*_name] : m_declarations[*_name]; if (!util::contains(decls, &_declaration)) decls.push_back(&_declaration); return true; @@ -142,13 +141,13 @@ bool DeclarationContainer::registerDeclaration( return registerDeclaration(_declaration, nullptr, nullptr, _invisible, _update); } -vector DeclarationContainer::resolveName( +std::vector DeclarationContainer::resolveName( ASTString const& _name, ResolvingSettings _settings ) const { solAssert(!_name.empty(), "Attempt to resolve empty name."); - vector result; + std::vector result; if (m_declarations.count(_name)) { @@ -172,24 +171,24 @@ vector DeclarationContainer::resolveName( return result; } -vector DeclarationContainer::similarNames(ASTString const& _name) const +std::vector DeclarationContainer::similarNames(ASTString const& _name) const { // because the function below has quadratic runtime - it will not magically improve once a better algorithm is discovered ;) // since 80 is the suggested line length limit, we use 80^2 as length threshold static size_t const MAXIMUM_LENGTH_THRESHOLD = 80 * 80; - vector similar; + std::vector similar; size_t maximumEditDistance = _name.size() > 3 ? 2 : _name.size() / 2; for (auto const& declaration: m_declarations) { - string const& declarationName = declaration.first; + std::string const& declarationName = declaration.first; if (util::stringWithinDistance(_name, declarationName, maximumEditDistance, MAXIMUM_LENGTH_THRESHOLD)) similar.push_back(declarationName); } for (auto const& declaration: m_invisibleDeclarations) { - string const& declarationName = declaration.first; + std::string const& declarationName = declaration.first; if (util::stringWithinDistance(_name, declarationName, maximumEditDistance, MAXIMUM_LENGTH_THRESHOLD)) similar.push_back(declarationName); } @@ -200,7 +199,7 @@ vector DeclarationContainer::similarNames(ASTString const& _name) con return similar; } -void DeclarationContainer::populateHomonyms(back_insert_iterator _it) const +void DeclarationContainer::populateHomonyms(std::back_insert_iterator _it) const { for (DeclarationContainer const* innerContainer: m_innerContainers) innerContainer->populateHomonyms(_it); @@ -210,7 +209,7 @@ void DeclarationContainer::populateHomonyms(back_insert_iterator _it) ResolvingSettings settings; settings.recursive = true; settings.alsoInvisible = true; - vector const& declarations = m_enclosingContainer->resolveName(name, std::move(settings)); + std::vector const& declarations = m_enclosingContainer->resolveName(name, std::move(settings)); if (!declarations.empty()) _it = make_pair(location, declarations); } diff --git a/libsolidity/analysis/DeclarationTypeChecker.cpp b/libsolidity/analysis/DeclarationTypeChecker.cpp index f17c854a7bff..28c051c0a000 100644 --- a/libsolidity/analysis/DeclarationTypeChecker.cpp +++ b/libsolidity/analysis/DeclarationTypeChecker.cpp @@ -29,7 +29,6 @@ #include -using namespace std; using namespace solidity::langutil; using namespace solidity::frontend; @@ -336,10 +335,10 @@ void DeclarationTypeChecker::endVisit(ArrayTypeName const& _typeName) if (Expression const* length = _typeName.length()) { - optional lengthValue; + std::optional lengthValue; if (length->annotation().type && length->annotation().type->category() == Type::Category::RationalNumber) lengthValue = dynamic_cast(*length->annotation().type).value(); - else if (optional value = ConstantEvaluator::evaluate(m_errorReporter, *length)) + else if (std::optional value = ConstantEvaluator::evaluate(m_errorReporter, *length)) lengthValue = value->value; if (!lengthValue) @@ -399,10 +398,10 @@ void DeclarationTypeChecker::endVisit(VariableDeclaration const& _variable) Location varLoc = _variable.referenceLocation(); DataLocation typeLoc = DataLocation::Memory; - set allowedDataLocations = _variable.allowedDataLocations(); + std::set allowedDataLocations = _variable.allowedDataLocations(); if (!allowedDataLocations.count(varLoc)) { - auto locationToString = [](VariableDeclaration::Location _location) -> string + auto locationToString = [](VariableDeclaration::Location _location) -> std::string { switch (_location) { @@ -414,7 +413,7 @@ void DeclarationTypeChecker::endVisit(VariableDeclaration const& _variable) return {}; }; - string errorString; + std::string errorString; if (!_variable.hasReferenceOrMappingType()) errorString = "Data location can only be specified for array, struct or mapping types"; else @@ -430,9 +429,9 @@ void DeclarationTypeChecker::endVisit(VariableDeclaration const& _variable) else if (_variable.isCallableOrCatchParameter()) errorString += " for " + - string(_variable.isReturnParameter() ? "return " : "") + + std::string(_variable.isReturnParameter() ? "return " : "") + "parameter in" + - string(_variable.isExternalCallableParameter() ? " external" : "") + + std::string(_variable.isExternalCallableParameter() ? " external" : "") + " function"; else errorString += " for variable"; diff --git a/libsolidity/analysis/DocStringAnalyser.cpp b/libsolidity/analysis/DocStringAnalyser.cpp index 5cff34f2a0ae..d4afadf26f5d 100644 --- a/libsolidity/analysis/DocStringAnalyser.cpp +++ b/libsolidity/analysis/DocStringAnalyser.cpp @@ -30,7 +30,6 @@ #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; @@ -38,7 +37,7 @@ using namespace solidity::frontend; namespace { -void copyMissingTags(set const& _baseFunctions, StructurallyDocumentedAnnotation& _target, FunctionType const* _functionType = nullptr) +void copyMissingTags(std::set const& _baseFunctions, StructurallyDocumentedAnnotation& _target, FunctionType const* _functionType = nullptr) { // Only copy if there is exactly one direct base function. if (_baseFunctions.size() != 1) @@ -50,7 +49,7 @@ void copyMissingTags(set const& _baseFunctions, Stru for (auto it = sourceDoc.docTags.begin(); it != sourceDoc.docTags.end();) { - string const& tag = it->first; + std::string const& tag = it->first; // Don't copy tag "inheritdoc", custom tags or already existing tags if (tag == "inheritdoc" || _target.docTags.count(tag) || boost::starts_with(tag, "custom")) { @@ -68,7 +67,7 @@ void copyMissingTags(set const& _baseFunctions, Stru if (_functionType && tag == "return") { size_t docParaNameEndPos = content.content.find_first_of(" \t"); - string const docParameterName = content.content.substr(0, docParaNameEndPos); + std::string const docParameterName = content.content.substr(0, docParaNameEndPos); if ( _functionType->returnParameterNames().size() > n && @@ -80,10 +79,10 @@ void copyMissingTags(set const& _baseFunctions, Stru baseFunction.returnParameters().size() > n && baseFunction.returnParameters().at(n)->name().empty(); - string paramName = _functionType->returnParameterNames().at(n); + std::string paramName = _functionType->returnParameterNames().at(n); content.content = (paramName.empty() ? "" : std::move(paramName) + " ") + ( - string::npos == docParaNameEndPos || baseHasNoName ? + std::string::npos == docParaNameEndPos || baseHasNoName ? content.content : content.content.substr(docParaNameEndPos + 1) ); @@ -95,7 +94,7 @@ void copyMissingTags(set const& _baseFunctions, Stru } } -CallableDeclaration const* findBaseCallable(set const& _baseFunctions, int64_t _contractId) +CallableDeclaration const* findBaseCallable(std::set const& _baseFunctions, int64_t _contractId) { for (CallableDeclaration const* baseFuncCandidate: _baseFunctions) if (baseFuncCandidate->annotation().contract->id() == _contractId) @@ -181,7 +180,7 @@ void DocStringAnalyser::handleCallable( } CallableDeclaration const* DocStringAnalyser::resolveInheritDoc( - set const& _baseFuncs, + std::set const& _baseFuncs, StructurallyDocumented const& _node, StructurallyDocumentedAnnotation& _annotation ) diff --git a/libsolidity/analysis/DocStringTagParser.cpp b/libsolidity/analysis/DocStringTagParser.cpp index 1dc2711ef1d3..5d95f42e902c 100644 --- a/libsolidity/analysis/DocStringTagParser.cpp +++ b/libsolidity/analysis/DocStringTagParser.cpp @@ -37,7 +37,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; @@ -67,7 +66,7 @@ bool DocStringTagParser::validateDocStringsUsingTypes(SourceUnit const& _sourceU if (tagName == "return") { returnTagsVisited++; - vector returnParameterNames; + std::vector returnParameterNames; if (auto const* varDecl = dynamic_cast(&_node)) { @@ -82,8 +81,8 @@ bool DocStringTagParser::validateDocStringsUsingTypes(SourceUnit const& _sourceU else continue; - string content = tagValue.content; - string firstWord = content.substr(0, content.find_first_of(" \t")); + std::string content = tagValue.content; + std::string firstWord = content.substr(0, content.find_first_of(" \t")); if (returnTagsVisited > returnParameterNames.size()) m_errorReporter.docstringParsingError( @@ -94,7 +93,7 @@ bool DocStringTagParser::validateDocStringsUsingTypes(SourceUnit const& _sourceU ); else { - string const& parameter = returnParameterNames.at(returnTagsVisited - 1); + std::string const& parameter = returnParameterNames.at(returnTagsVisited - 1); if (!parameter.empty() && parameter != firstWord) m_errorReporter.docstringParsingError( 5856_error, @@ -113,7 +112,7 @@ bool DocStringTagParser::validateDocStringsUsingTypes(SourceUnit const& _sourceU bool DocStringTagParser::visit(ContractDefinition const& _contract) { - static set const validTags = set{"author", "title", "dev", "notice"}; + static std::set const validTags = std::set{"author", "title", "dev", "notice"}; parseDocStrings(_contract, _contract.annotation(), validTags, "contracts"); return true; @@ -193,12 +192,12 @@ bool DocStringTagParser::visit(InlineAssembly const& _assembly) { if (tagName == "solidity") { - vector values; + std::vector values; boost::split(values, tagValue.content, isWhiteSpace); - set valuesSeen; - set duplicates; - for (auto const& value: values | ranges::views::filter(not_fn(&string::empty))) + std::set valuesSeen; + std::set duplicates; + for (auto const& value: values | ranges::views::filter(not_fn(&std::string::empty))) if (valuesSeen.insert(value).second) { if (value == "memory-safe-assembly") @@ -244,7 +243,7 @@ void DocStringTagParser::checkParameters( StructurallyDocumentedAnnotation& _annotation ) { - set validParams; + std::set validParams; for (auto const& p: _callable.parameters()) validParams.insert(p->name()); if (_callable.returnParameterList()) @@ -268,7 +267,7 @@ void DocStringTagParser::handleConstructor( StructurallyDocumentedAnnotation& _annotation ) { - static set const validTags = set{"author", "dev", "notice", "param"}; + static std::set const validTags = std::set{"author", "dev", "notice", "param"}; parseDocStrings(_node, _annotation, validTags, "constructor"); checkParameters(_callable, _node, _annotation); } @@ -279,10 +278,10 @@ void DocStringTagParser::handleCallable( StructurallyDocumentedAnnotation& _annotation ) { - static set const validEventTags = set{"dev", "notice", "return", "param"}; - static set const validErrorTags = set{"dev", "notice", "param"}; - static set const validModifierTags = set{"dev", "notice", "param", "inheritdoc"}; - static set const validTags = set{"dev", "notice", "return", "param", "inheritdoc"}; + static std::set const validEventTags = std::set{"dev", "notice", "return", "param"}; + static std::set const validErrorTags = std::set{"dev", "notice", "param"}; + static std::set const validModifierTags = std::set{"dev", "notice", "param", "inheritdoc"}; + static std::set const validTags = std::set{"dev", "notice", "return", "param", "inheritdoc"}; if (dynamic_cast(&_callable)) parseDocStrings(_node, _annotation, validEventTags, "events"); @@ -299,8 +298,8 @@ void DocStringTagParser::handleCallable( void DocStringTagParser::parseDocStrings( StructurallyDocumented const& _node, StructurallyDocumentedAnnotation& _annotation, - set const& _validTags, - string const& _nodeName + std::set const& _validTags, + std::string const& _nodeName ) { if (!_node.documentation()) @@ -310,7 +309,7 @@ void DocStringTagParser::parseDocStrings( for (auto const& [tagName, tagValue]: _annotation.docTags) { - string_view static constexpr customPrefix("custom:"); + std::string_view static constexpr customPrefix("custom:"); if (tagName == "custom" || tagName == "custom:") m_errorReporter.docstringParsingError( 6564_error, @@ -319,7 +318,7 @@ void DocStringTagParser::parseDocStrings( ); else if (boost::starts_with(tagName, customPrefix) && tagName.size() > customPrefix.size()) { - regex static const customRegex("^custom:[a-z][a-z-]*$"); + std::regex static const customRegex("^custom:[a-z][a-z-]*$"); if (!regex_match(tagName, customRegex)) m_errorReporter.docstringParsingError( 2968_error, diff --git a/libsolidity/analysis/FunctionCallGraph.cpp b/libsolidity/analysis/FunctionCallGraph.cpp index ce5c539346b5..1d01f1a6bced 100644 --- a/libsolidity/analysis/FunctionCallGraph.cpp +++ b/libsolidity/analysis/FunctionCallGraph.cpp @@ -24,7 +24,6 @@ #include #include -using namespace std; using namespace solidity::frontend; using namespace solidity::util; @@ -72,7 +71,7 @@ CallGraph FunctionCallGraphBuilder::buildDeployedGraph( FunctionCallGraphBuilder builder(_contract); solAssert(builder.m_currentNode == CallGraph::Node(CallGraph::SpecialNode::Entry), ""); - auto getSecondElement = [](auto const& _tuple){ return get<1>(_tuple); }; + auto getSecondElement = [](auto const& _tuple){ return std::get<1>(_tuple); }; // Create graph for all publicly reachable functions for (FunctionTypePointer functionType: _contract.interfaceFunctionList() | ranges::views::transform(getSecondElement)) @@ -96,14 +95,14 @@ CallGraph FunctionCallGraphBuilder::buildDeployedGraph( // All functions present in internal dispatch at creation time could potentially be pointers // assigned to state variables and as such may be reachable after deployment as well. builder.m_currentNode = CallGraph::SpecialNode::InternalDispatch; - set defaultNode; + std::set defaultNode; for (CallGraph::Node const& dispatchTarget: util::valueOrDefault(_creationGraph.edges, CallGraph::SpecialNode::InternalDispatch, defaultNode)) { - solAssert(!holds_alternative(dispatchTarget), ""); - solAssert(get(dispatchTarget) != nullptr, ""); + solAssert(!std::holds_alternative(dispatchTarget), ""); + solAssert(std::get(dispatchTarget) != nullptr, ""); // Visit the callable to add not only it but also everything it calls too - builder.functionReferenced(*get(dispatchTarget), false); + builder.functionReferenced(*std::get(dispatchTarget), false); } builder.m_currentNode = CallGraph::SpecialNode::Entry; @@ -262,10 +261,10 @@ void FunctionCallGraphBuilder::processQueue() while (!m_visitQueue.empty()) { m_currentNode = m_visitQueue.front(); - solAssert(holds_alternative(m_currentNode), ""); + solAssert(std::holds_alternative(m_currentNode), ""); m_visitQueue.pop_front(); - get(m_currentNode)->accept(*this); + std::get(m_currentNode)->accept(*this); } m_currentNode = CallGraph::SpecialNode::Entry; @@ -281,7 +280,7 @@ void FunctionCallGraphBuilder::functionReferenced(CallableDeclaration const& _ca if (_calledDirectly) { solAssert( - holds_alternative(m_currentNode) || m_graph.edges.count(m_currentNode) > 0, + std::holds_alternative(m_currentNode) || m_graph.edges.count(m_currentNode) > 0, "Adding an edge from a node that has not been visited yet." ); @@ -293,10 +292,10 @@ void FunctionCallGraphBuilder::functionReferenced(CallableDeclaration const& _ca enqueueCallable(_callable); } -ostream& solidity::frontend::operator<<(ostream& _out, CallGraph::Node const& _node) +std::ostream& solidity::frontend::operator<<(std::ostream& _out, CallGraph::Node const& _node) { - if (holds_alternative(_node)) - switch (get(_node)) + if (std::holds_alternative(_node)) + switch (std::get(_node)) { case CallGraph::SpecialNode::InternalDispatch: _out << "InternalDispatch"; @@ -309,19 +308,19 @@ ostream& solidity::frontend::operator<<(ostream& _out, CallGraph::Node const& _n } else { - solAssert(holds_alternative(_node), ""); + solAssert(std::holds_alternative(_node), ""); - auto const* callableDeclaration = get(_node); + auto const* callableDeclaration = std::get(_node); solAssert(callableDeclaration, ""); auto const* function = dynamic_cast(callableDeclaration); auto const* event = dynamic_cast(callableDeclaration); auto const* modifier = dynamic_cast(callableDeclaration); - auto typeToString = [](auto const& _var) -> string { return _var->type()->toString(true); }; - vector parameters = callableDeclaration->parameters() | ranges::views::transform(typeToString) | ranges::to>(); + auto typeToString = [](auto const& _var) -> std::string { return _var->type()->toString(true); }; + std::vector parameters = callableDeclaration->parameters() | ranges::views::transform(typeToString) | ranges::to>(); - string scopeName; + std::string scopeName; if (!function || !function->isFree()) { solAssert(callableDeclaration->annotation().scope, ""); diff --git a/libsolidity/analysis/GlobalContext.cpp b/libsolidity/analysis/GlobalContext.cpp index 58ebea7b1ae7..8f0ce963499b 100644 --- a/libsolidity/analysis/GlobalContext.cpp +++ b/libsolidity/analysis/GlobalContext.cpp @@ -29,8 +29,6 @@ #include #include -using namespace std; - namespace solidity::frontend { @@ -65,10 +63,10 @@ int magicVariableToID(std::string const& _name) solAssert(false, "Unknown magic variable: \"" + _name + "\"."); } -inline vector> constructMagicVariables() +inline std::vector> constructMagicVariables() { - static auto const magicVarDecl = [](string const& _name, Type const* _type) { - return make_shared(magicVariableToID(_name), _name, _type); + static auto const magicVarDecl = [](std::string const& _name, Type const* _type) { + return std::make_shared(magicVariableToID(_name), _name, _type); }; return { @@ -116,9 +114,9 @@ void GlobalContext::setCurrentContract(ContractDefinition const& _contract) m_currentContract = &_contract; } -vector GlobalContext::declarations() const +std::vector GlobalContext::declarations() const { - vector declarations; + std::vector declarations; declarations.reserve(m_magicVariables.size()); for (ASTPointer const& variable: m_magicVariables) declarations.push_back(variable.get()); @@ -133,7 +131,7 @@ MagicVariableDeclaration const* GlobalContext::currentThis() const if (m_currentContract) type = TypeProvider::contract(*m_currentContract); m_thisPointer[m_currentContract] = - make_shared(magicVariableToID("this"), "this", type); + std::make_shared(magicVariableToID("this"), "this", type); } return m_thisPointer[m_currentContract].get(); } @@ -146,7 +144,7 @@ MagicVariableDeclaration const* GlobalContext::currentSuper() const if (m_currentContract) type = TypeProvider::typeType(TypeProvider::contract(*m_currentContract, true)); m_superPointer[m_currentContract] = - make_shared(magicVariableToID("super"), "super", type); + std::make_shared(magicVariableToID("super"), "super", type); } return m_superPointer[m_currentContract].get(); } diff --git a/libsolidity/analysis/NameAndTypeResolver.cpp b/libsolidity/analysis/NameAndTypeResolver.cpp index 641f02280430..d6ff63dbf34f 100644 --- a/libsolidity/analysis/NameAndTypeResolver.cpp +++ b/libsolidity/analysis/NameAndTypeResolver.cpp @@ -30,7 +30,6 @@ #include #include -using namespace std; using namespace solidity::langutil; namespace solidity::frontend @@ -45,7 +44,7 @@ NameAndTypeResolver::NameAndTypeResolver( m_errorReporter(_errorReporter), m_globalContext(_globalContext) { - m_scopes[nullptr] = make_shared(); + m_scopes[nullptr] = std::make_shared(); for (Declaration const* declaration: _globalContext.declarations()) { solAssert(m_scopes[nullptr]->registerDeclaration(*declaration, false, false), "Unable to register global declaration."); @@ -68,14 +67,14 @@ bool NameAndTypeResolver::registerDeclarations(SourceUnit& _sourceUnit, ASTNode return true; } -bool NameAndTypeResolver::performImports(SourceUnit& _sourceUnit, map const& _sourceUnits) +bool NameAndTypeResolver::performImports(SourceUnit& _sourceUnit, std::map const& _sourceUnits) { DeclarationContainer& target = *m_scopes.at(&_sourceUnit); bool error = false; for (auto const& node: _sourceUnit.nodes()) if (auto imp = dynamic_cast(node.get())) { - string const& path = *imp->annotation().absolutePath; + std::string const& path = *imp->annotation().absolutePath; // The import resolution in CompilerStack enforces this. solAssert(_sourceUnits.count(path), ""); auto scope = m_scopes.find(_sourceUnits.at(path)); @@ -127,7 +126,7 @@ bool NameAndTypeResolver::resolveNamesAndTypes(SourceUnit& _source) { try { - for (shared_ptr const& node: _source.nodes()) + for (std::shared_ptr const& node: _source.nodes()) { setScope(&_source); if (!resolveNamesAndTypesInternal(*node, true)) @@ -159,7 +158,7 @@ bool NameAndTypeResolver::updateDeclaration(Declaration const& _declaration) return true; } -void NameAndTypeResolver::activateVariable(string const& _name) +void NameAndTypeResolver::activateVariable(std::string const& _name) { solAssert(m_currentScope, ""); // Scoped local variables are invisible before activation. @@ -171,15 +170,15 @@ void NameAndTypeResolver::activateVariable(string const& _name) m_currentScope->activateVariable(_name); } -vector NameAndTypeResolver::resolveName(ASTString const& _name, ASTNode const* _scope) const +std::vector NameAndTypeResolver::resolveName(ASTString const& _name, ASTNode const* _scope) const { auto iterator = m_scopes.find(_scope); if (iterator == end(m_scopes)) - return vector({}); + return std::vector({}); return iterator->second->resolveName(_name); } -vector NameAndTypeResolver::nameFromCurrentScope(ASTString const& _name, bool _includeInvisibles) const +std::vector NameAndTypeResolver::nameFromCurrentScope(ASTString const& _name, bool _includeInvisibles) const { ResolvingSettings settings; settings.recursive = true; @@ -187,7 +186,7 @@ vector NameAndTypeResolver::nameFromCurrentScope(ASTString c return m_currentScope->resolveName(_name, std::move(settings)); } -Declaration const* NameAndTypeResolver::pathFromCurrentScope(vector const& _path) const +Declaration const* NameAndTypeResolver::pathFromCurrentScope(std::vector const& _path) const { if (auto declarations = pathFromCurrentScopeWithAllDeclarations(_path); !declarations.empty()) return declarations.back(); @@ -201,13 +200,13 @@ std::vector NameAndTypeResolver::pathFromCurrentScopeWithAll ) const { solAssert(!_path.empty(), ""); - vector pathDeclarations; + std::vector pathDeclarations; ResolvingSettings settings; settings.recursive = true; settings.alsoInvisible = _includeInvisibles; settings.onlyVisibleAsUnqualifiedNames = true; - vector candidates = m_currentScope->resolveName(_path.front(), settings); + std::vector candidates = m_currentScope->resolveName(_path.front(), settings); // inside the loop, use default settings, except for alsoInvisible settings.recursive = false; @@ -305,7 +304,7 @@ bool NameAndTypeResolver::resolveNamesAndTypesInternal(ASTNode& _node, bool _res if (success) { linearizeBaseContracts(*contract); - vector properBases( + std::vector properBases( ++contract->annotation().linearizedBaseContracts.begin(), contract->annotation().linearizedBaseContracts.end() ); @@ -405,7 +404,7 @@ void NameAndTypeResolver::linearizeBaseContracts(ContractDefinition& _contract) { // order in the lists is from derived to base // list of lists to linearize, the last element is the list of direct bases - list> input(1, list{}); + std::list> input(1, std::list{}); for (ASTPointer const& baseSpecifier: _contract.baseContracts()) { IdentifierPath const& baseName = baseSpecifier->name(); @@ -415,25 +414,25 @@ void NameAndTypeResolver::linearizeBaseContracts(ContractDefinition& _contract) // "push_front" has the effect that bases mentioned later can overwrite members of bases // mentioned earlier input.back().push_front(base); - vector const& basesBases = base->annotation().linearizedBaseContracts; + std::vector const& basesBases = base->annotation().linearizedBaseContracts; if (basesBases.empty()) m_errorReporter.fatalTypeError(2449_error, baseName.location(), "Definition of base has to precede definition of derived contract"); - input.push_front(list(basesBases.begin(), basesBases.end())); + input.push_front(std::list(basesBases.begin(), basesBases.end())); } input.back().push_front(&_contract); - vector result = cThreeMerge(input); + std::vector result = cThreeMerge(input); if (result.empty()) m_errorReporter.fatalTypeError(5005_error, _contract.location(), "Linearization of inheritance graph impossible"); _contract.annotation().linearizedBaseContracts = result; } template -vector NameAndTypeResolver::cThreeMerge(list>& _toMerge) +std::vector NameAndTypeResolver::cThreeMerge(std::list>& _toMerge) { // returns true iff _candidate appears only as last element of the lists auto appearsOnlyAtHead = [&](T const* _candidate) -> bool { - for (list const& bases: _toMerge) + for (std::list const& bases: _toMerge) { solAssert(!bases.empty(), ""); if (find(++bases.begin(), bases.end(), _candidate) != bases.end()) @@ -444,7 +443,7 @@ vector NameAndTypeResolver::cThreeMerge(list>& _toMerge // returns the next candidate to append to the linearized list or nullptr on failure auto nextCandidate = [&]() -> T const* { - for (list const& bases: _toMerge) + for (std::list const& bases: _toMerge) { solAssert(!bases.empty(), ""); if (appearsOnlyAtHead(bases.front())) @@ -465,26 +464,26 @@ vector NameAndTypeResolver::cThreeMerge(list>& _toMerge } }; - _toMerge.remove_if([](list const& _bases) { return _bases.empty(); }); - vector result; + _toMerge.remove_if([](std::list const& _bases) { return _bases.empty(); }); + std::vector result; while (!_toMerge.empty()) { T const* candidate = nextCandidate(); if (!candidate) - return vector(); + return std::vector(); result.push_back(candidate); removeCandidate(candidate); } return result; } -string NameAndTypeResolver::similarNameSuggestions(ASTString const& _name) const + std::string NameAndTypeResolver::similarNameSuggestions(ASTString const& _name) const { return util::quotedAlternativesList(m_currentScope->similarNames(_name)); } DeclarationRegistrationHelper::DeclarationRegistrationHelper( - map>& _scopes, + std::map>& _scopes, ASTNode& _astRoot, ErrorReporter& _errorReporter, GlobalContext& _globalContext, @@ -502,7 +501,7 @@ DeclarationRegistrationHelper::DeclarationRegistrationHelper( bool DeclarationRegistrationHelper::registerDeclaration( DeclarationContainer& _container, Declaration const& _declaration, - string const* _name, + std::string const* _name, SourceLocation const* _errorLocation, bool _inactive, ErrorReporter& _errorReporter @@ -511,13 +510,13 @@ bool DeclarationRegistrationHelper::registerDeclaration( if (!_errorLocation) _errorLocation = &_declaration.location(); - string name = _name ? *_name : _declaration.name(); + std::string name = _name ? *_name : _declaration.name(); // We use "invisible" for both inactive variables in blocks and for members invisible in contracts. // They cannot both be true at the same time. solAssert(!(_inactive && !_declaration.isVisibleInContract()), ""); - static set illegalNames{"_", "super", "this"}; + static std::set illegalNames{"_", "super", "this"}; if (illegalNames.count(name)) { @@ -580,7 +579,7 @@ bool DeclarationRegistrationHelper::visit(SourceUnit& _sourceUnit) { if (!m_scopes[&_sourceUnit]) // By importing, it is possible that the container already exists. - m_scopes[&_sourceUnit] = make_shared(m_currentScope, m_scopes[m_currentScope].get()); + m_scopes[&_sourceUnit] = std::make_shared(m_currentScope, m_scopes[m_currentScope].get()); return ASTVisitor::visit(_sourceUnit); } @@ -594,7 +593,7 @@ bool DeclarationRegistrationHelper::visit(ImportDirective& _import) SourceUnit const* importee = _import.annotation().sourceUnit; solAssert(!!importee, ""); if (!m_scopes[importee]) - m_scopes[importee] = make_shared(nullptr, m_scopes[nullptr].get()); + m_scopes[importee] = std::make_shared(nullptr, m_scopes[nullptr].get()); m_scopes[&_import] = m_scopes[importee]; ASTVisitor::visit(_import); return false; // Do not recurse into child nodes (Identifier for symbolAliases) @@ -641,7 +640,7 @@ bool DeclarationRegistrationHelper::visitNode(ASTNode& _node) if (auto* annotation = dynamic_cast(&_node.annotation())) { - string canonicalName = dynamic_cast(_node).name(); + std::string canonicalName = dynamic_cast(_node).name(); solAssert(!canonicalName.empty(), ""); for ( @@ -684,7 +683,7 @@ void DeclarationRegistrationHelper::enterNewSubScope(ASTNode& _subScope) { bool newlyAdded = m_scopes.emplace( &_subScope, - make_shared(m_currentScope, m_scopes[m_currentScope].get()) + std::make_shared(m_currentScope, m_scopes[m_currentScope].get()) ).second; solAssert(newlyAdded, "Unable to add new scope."); } diff --git a/libsolidity/analysis/OverrideChecker.cpp b/libsolidity/analysis/OverrideChecker.cpp index d342ab100359..f2a99340deee 100644 --- a/libsolidity/analysis/OverrideChecker.cpp +++ b/libsolidity/analysis/OverrideChecker.cpp @@ -31,7 +31,6 @@ #include -using namespace std; using namespace solidity; using namespace solidity::frontend; using namespace solidity::langutil; @@ -46,7 +45,7 @@ namespace // Helper struct to do a search by name struct MatchByName { - string const& m_name; + std::string const& m_name; bool operator()(OverrideProxy const& _item) { return _item.name() == m_name; @@ -61,7 +60,7 @@ struct MatchByName */ struct OverrideGraph { - OverrideGraph(set const& _baseCallables) + OverrideGraph(std::set const& _baseCallables) { for (auto const& baseFunction: _baseCallables) addEdge(0, visit(baseFunction)); @@ -131,17 +130,17 @@ struct CutVertexFinder run(vInd, _depth + 1); if (m_low[vInd] >= m_depths[_u] && m_parent[_u] != -1) m_cutVertices.insert(m_graph.nodeInv.at(static_cast(_u))); - m_low[_u] = min(m_low[_u], m_low[vInd]); + m_low[_u] = std::min(m_low[_u], m_low[vInd]); } else if (v != m_parent[_u]) - m_low[_u] = min(m_low[_u], m_depths[vInd]); + m_low[_u] = std::min(m_low[_u], m_depths[vInd]); } } }; -vector resolveDirectBaseContracts(ContractDefinition const& _contract) +std::vector resolveDirectBaseContracts(ContractDefinition const& _contract) { - vector resolvedContracts; + std::vector resolvedContracts; for (ASTPointer const& specifier: _contract.baseContracts()) { @@ -155,7 +154,7 @@ vector resolveDirectBaseContracts(ContractDefinition return resolvedContracts; } -vector> sortByContract(vector> const& _list) +std::vector> sortByContract(std::vector> const& _list) { auto sorted = _list; @@ -197,17 +196,17 @@ bool OverrideProxy::operator<(OverrideProxy const& _other) const bool OverrideProxy::isVariable() const { - return holds_alternative(m_item); + return std::holds_alternative(m_item); } bool OverrideProxy::isFunction() const { - return holds_alternative(m_item); + return std::holds_alternative(m_item); } bool OverrideProxy::isModifier() const { - return holds_alternative(m_item); + return std::holds_alternative(m_item); } bool OverrideProxy::CompareBySignature::operator()(OverrideProxy const& _a, OverrideProxy const& _b) const @@ -222,18 +221,18 @@ size_t OverrideProxy::id() const }, m_item); } -shared_ptr OverrideProxy::overrides() const +std::shared_ptr OverrideProxy::overrides() const { return std::visit(GenericVisitor{ [&](auto const* _item) { return _item->overrides(); } }, m_item); } -set OverrideProxy::baseFunctions() const +std::set OverrideProxy::baseFunctions() const { return std::visit(GenericVisitor{ - [&](auto const* _item) -> set { - set ret; + [&](auto const* _item) -> std::set { + std::set ret; for (auto const* f: _item->annotation().baseFunctions) ret.insert(makeOverrideProxy(*f)); return ret; @@ -256,10 +255,10 @@ void OverrideProxy::storeBaseFunction(OverrideProxy const& _base) const }, m_item); } -string const& OverrideProxy::name() const +std::string const& OverrideProxy::name() const { return std::visit(GenericVisitor{ - [&](auto const* _item) -> string const& { return _item->name(); } + [&](auto const* _item) -> std::string const& { return _item->name(); } }, m_item); } @@ -272,7 +271,7 @@ ContractDefinition const& OverrideProxy::contract() const }, m_item); } -string const& OverrideProxy::contractName() const +std::string const& OverrideProxy::contractName() const { return contract().name(); } @@ -357,7 +356,7 @@ SourceLocation const& OverrideProxy::location() const }, m_item); } -string OverrideProxy::astNodeName() const +std::string OverrideProxy::astNodeName() const { return std::visit(GenericVisitor{ [&](FunctionDefinition const*) { return "function"; }, @@ -366,7 +365,7 @@ string OverrideProxy::astNodeName() const }, m_item); } -string OverrideProxy::astNodeNameCapitalized() const +std::string OverrideProxy::astNodeNameCapitalized() const { return std::visit(GenericVisitor{ [&](FunctionDefinition const*) { return "Function"; }, @@ -375,7 +374,7 @@ string OverrideProxy::astNodeNameCapitalized() const }, m_item); } -string OverrideProxy::distinguishingProperty() const +std::string OverrideProxy::distinguishingProperty() const { return std::visit(GenericVisitor{ [&](FunctionDefinition const*) { return "name and parameter types"; }, @@ -418,10 +417,10 @@ OverrideProxy::OverrideComparator const& OverrideProxy::overrideComparator() con { if (!m_comparator) { - m_comparator = make_shared(std::visit(GenericVisitor{ + m_comparator = std::make_shared(std::visit(GenericVisitor{ [&](FunctionDefinition const* _function) { - vector paramTypes; + std::vector paramTypes; for (Type const* t: externalFunctionType()->parameterTypes()) paramTypes.emplace_back(t->richIdentifier()); return OverrideComparator{ @@ -432,7 +431,7 @@ OverrideProxy::OverrideComparator const& OverrideProxy::overrideComparator() con }, [&](VariableDeclaration const* _var) { - vector paramTypes; + std::vector paramTypes; for (Type const* t: externalFunctionType()->parameterTypes()) paramTypes.emplace_back(t->richIdentifier()); return OverrideComparator{ @@ -674,21 +673,21 @@ void OverrideChecker::checkOverride(OverrideProxy const& _overriding, OverridePr void OverrideChecker::overrideListError( OverrideProxy const& _item, - set _secondary, + std::set _secondary, ErrorId _error, - string const& _message1, - string const& _message2 + std::string const& _message1, + std::string const& _message2 ) { // Using a set rather than a vector so the order is always the same - set names; + std::set names; SecondarySourceLocation ssl; for (Declaration const* c: _secondary) { ssl.append("This contract: ", c->location()); names.insert("\"" + c->name() + "\""); } - string contractSingularPlural = "contract "; + std::string contractSingularPlural = "contract "; if (_secondary.size() > 1) contractSingularPlural = "contracts "; @@ -708,8 +707,8 @@ void OverrideChecker::overrideError( OverrideProxy const& _overriding, OverrideProxy const& _super, ErrorId _error, - string const& _message, - optional const& _secondaryMsg + std::string const& _message, + std::optional const& _secondaryMsg ) { m_errorReporter.typeError( @@ -766,7 +765,7 @@ void OverrideChecker::checkAmbiguousOverrides(ContractDefinition const& _contrac } } -void OverrideChecker::checkAmbiguousOverridesInternal(set _baseCallables, SourceLocation const& _location) const +void OverrideChecker::checkAmbiguousOverridesInternal(std::set _baseCallables, SourceLocation const& _location) const { if (_baseCallables.size() <= 1) return; @@ -799,17 +798,17 @@ void OverrideChecker::checkAmbiguousOverridesInternal(set _baseCa for (OverrideProxy const& baseFunction: _baseCallables) ssl.append("Definition in \"" + baseFunction.contractName() + "\": ", baseFunction.location()); - string callableName = _baseCallables.begin()->astNodeName(); + std::string callableName = _baseCallables.begin()->astNodeName(); if (_baseCallables.begin()->isVariable()) callableName = "function"; - string distinguishigProperty = _baseCallables.begin()->distinguishingProperty(); + std::string distinguishigProperty = _baseCallables.begin()->distinguishingProperty(); bool foundVariable = false; for (auto const& base: _baseCallables) if (base.isVariable()) foundVariable = true; - string message = + std::string message = "Derived contract must override " + callableName + " \"" + _baseCallables.begin()->name() + "\". Two or more base classes define " + callableName + " with same " + distinguishigProperty + "."; @@ -822,9 +821,9 @@ void OverrideChecker::checkAmbiguousOverridesInternal(set _baseCa m_errorReporter.typeError(6480_error, _location, ssl, message); } -set OverrideChecker::resolveOverrideList(OverrideSpecifier const& _overrides) const +std::set OverrideChecker::resolveOverrideList(OverrideSpecifier const& _overrides) const { - set resolved; + std::set resolved; for (ASTPointer const& override: _overrides.overrides()) { @@ -842,7 +841,7 @@ set OverrideChecker::re void OverrideChecker::checkOverrideList(OverrideProxy _item, OverrideProxyBySignatureMultiSet const& _inherited) { - set specifiedContracts = + std::set specifiedContracts = _item.overrides() ? resolveOverrideList(*_item.overrides()) : decltype(specifiedContracts){}; @@ -851,7 +850,7 @@ void OverrideChecker::checkOverrideList(OverrideProxy _item, OverrideProxyBySign if (_item.overrides() && specifiedContracts.size() != _item.overrides()->overrides().size()) { // Sort by contract id to find duplicate for error reporting - vector> list = + std::vector> list = sortByContract(_item.overrides()->overrides()); // Find duplicates and output error @@ -880,7 +879,7 @@ void OverrideChecker::checkOverrideList(OverrideProxy _item, OverrideProxyBySign } } - set expectedContracts; + std::set expectedContracts; // Build list of expected contracts for (auto [begin, end] = _inherited.equal_range(_item); begin != end; begin++) @@ -898,7 +897,7 @@ void OverrideChecker::checkOverrideList(OverrideProxy _item, OverrideProxyBySign _item.astNodeNameCapitalized() + " has override specified but does not override anything." ); - set missingContracts; + std::set missingContracts; // If we expect only one contract, no contract needs to be specified if (expectedContracts.size() > 1) missingContracts = expectedContracts - specifiedContracts; @@ -931,7 +930,7 @@ OverrideChecker::OverrideProxyBySignatureMultiSet const& OverrideChecker::inheri for (auto const* base: resolveDirectBaseContracts(_contract)) { - set functionsInBase; + std::set functionsInBase; for (FunctionDefinition const* fun: base->definedFunctions()) if (!fun->isConstructor()) functionsInBase.emplace(OverrideProxy{fun}); @@ -960,7 +959,7 @@ OverrideChecker::OverrideProxyBySignatureMultiSet const& OverrideChecker::inheri for (auto const* base: resolveDirectBaseContracts(_contract)) { - set modifiersInBase; + std::set modifiersInBase; for (ModifierDefinition const* mod: base->functionModifiers()) modifiersInBase.emplace(OverrideProxy{mod}); diff --git a/libsolidity/analysis/PostTypeChecker.cpp b/libsolidity/analysis/PostTypeChecker.cpp index c8b3b5f162b2..bc9df3dc4c82 100644 --- a/libsolidity/analysis/PostTypeChecker.cpp +++ b/libsolidity/analysis/PostTypeChecker.cpp @@ -27,7 +27,6 @@ #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; @@ -204,7 +203,7 @@ struct ConstStateVarCircularReferenceChecker: public PostTypeChecker::Checker // Iterating through the dependencies needs to be deterministic and thus cannot // depend on the memory layout. // Because of that, we sort by AST node id. - vector dependencies( + std::vector dependencies( m_constVariableDependencies[&_variable].begin(), m_constVariableDependencies[&_variable].end() ); @@ -427,10 +426,10 @@ struct ReservedErrorSelector: public PostTypeChecker::Checker PostTypeChecker::PostTypeChecker(langutil::ErrorReporter& _errorReporter): m_errorReporter(_errorReporter) { - m_checkers.push_back(make_shared(_errorReporter)); - m_checkers.push_back(make_shared(_errorReporter)); - m_checkers.push_back(make_shared(_errorReporter)); - m_checkers.push_back(make_shared(_errorReporter)); - m_checkers.push_back(make_shared(_errorReporter)); - m_checkers.push_back(make_shared(_errorReporter)); + m_checkers.push_back(std::make_shared(_errorReporter)); + m_checkers.push_back(std::make_shared(_errorReporter)); + m_checkers.push_back(std::make_shared(_errorReporter)); + m_checkers.push_back(std::make_shared(_errorReporter)); + m_checkers.push_back(std::make_shared(_errorReporter)); + m_checkers.push_back(std::make_shared(_errorReporter)); } diff --git a/libsolidity/analysis/PostTypeContractLevelChecker.cpp b/libsolidity/analysis/PostTypeContractLevelChecker.cpp index 67d0623aa04f..6d8dc416aa00 100644 --- a/libsolidity/analysis/PostTypeContractLevelChecker.cpp +++ b/libsolidity/analysis/PostTypeContractLevelChecker.cpp @@ -26,7 +26,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; @@ -48,10 +47,10 @@ bool PostTypeContractLevelChecker::check(ContractDefinition const& _contract) "" ); - map> errorHashes; + std::map> errorHashes; for (ErrorDefinition const* error: _contract.interfaceErrors()) { - string signature = error->functionType(true)->externalSignature(); + std::string signature = error->functionType(true)->externalSignature(); uint32_t hash = util::selectorFromSignatureU32(signature); // Fail if there is a different signature for the same hash. if (!errorHashes[hash].empty() && !errorHashes[hash].count(signature)) diff --git a/libsolidity/analysis/ReferencesResolver.cpp b/libsolidity/analysis/ReferencesResolver.cpp index 399c15b56e36..e680021331a2 100644 --- a/libsolidity/analysis/ReferencesResolver.cpp +++ b/libsolidity/analysis/ReferencesResolver.cpp @@ -39,7 +39,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; @@ -121,8 +120,8 @@ bool ReferencesResolver::visit(Identifier const& _identifier) auto declarations = m_resolver.nameFromCurrentScope(_identifier.name()); if (declarations.empty()) { - string suggestions = m_resolver.similarNameSuggestions(_identifier.name()); - string errorMessage = "Undeclared identifier."; + std::string suggestions = m_resolver.similarNameSuggestions(_identifier.name()); + std::string errorMessage = "Undeclared identifier."; if (!suggestions.empty()) { if ("\"" + _identifier.name() + "\"" == suggestions) @@ -192,10 +191,10 @@ bool ReferencesResolver::visit(UsingForDirective const& _usingFor) // _includeInvisibles is enabled here because external library functions are marked invisible. // As unintended side-effects other invisible names (eg.: super, this) may be returned as well. // DeclarationTypeChecker should detect and report such situations. - vector declarations = m_resolver.pathFromCurrentScopeWithAllDeclarations(path->path(), true /* _includeInvisibles */); + std::vector declarations = m_resolver.pathFromCurrentScopeWithAllDeclarations(path->path(), true /* _includeInvisibles */); if (declarations.empty()) { - string libraryOrFunctionNameErrorMessage = + std::string libraryOrFunctionNameErrorMessage = _usingFor.usesBraces() ? "Identifier is not a function name or not unique." : "Identifier is not a library name."; @@ -253,9 +252,9 @@ void ReferencesResolver::operator()(yul::Identifier const& _identifier) { solAssert(nativeLocationOf(_identifier) == originLocationOf(_identifier), ""); - static set suffixes{"slot", "offset", "length", "address", "selector"}; - string suffix; - for (string const& s: suffixes) + static std::set suffixes{"slot", "offset", "length", "address", "selector"}; + std::string suffix; + for (std::string const& s: suffixes) if (boost::algorithm::ends_with(_identifier.name.str(), "." + s)) suffix = s; @@ -269,7 +268,7 @@ void ReferencesResolver::operator()(yul::Identifier const& _identifier) if (!declarations.empty()) // the special identifier exists itself, we should not allow that. return; - string realName = _identifier.name.str().substr(0, _identifier.name.str().size() - suffix.size() - 1); + std::string realName = _identifier.name.str().substr(0, _identifier.name.str().size() - suffix.size() - 1); solAssert(!realName.empty(), "Empty name."); declarations = m_resolver.nameFromCurrentScope(realName); if (!declarations.empty()) @@ -350,7 +349,7 @@ void ReferencesResolver::resolveInheritDoc(StructuredDocumentation const& _docum break; case 1: { - string const& name = _annotation.docTags.find("inheritdoc")->second.content; + std::string const& name = _annotation.docTags.find("inheritdoc")->second.content; if (name.empty()) { m_errorReporter.docstringParsingError( @@ -361,7 +360,7 @@ void ReferencesResolver::resolveInheritDoc(StructuredDocumentation const& _docum return; } - vector path; + std::vector path; boost::split(path, name, boost::is_any_of(".")); if (any_of(path.begin(), path.end(), [](auto& _str) { return _str.empty(); })) { @@ -421,7 +420,7 @@ void ReferencesResolver::validateYulIdentifierName(yul::YulString _name, SourceL "User-defined identifiers in inline assembly cannot contain '.'." ); - if (set{"this", "super", "_"}.count(_name.str())) + if (std::set{"this", "super", "_"}.count(_name.str())) m_errorReporter.declarationError( 4113_error, _location, diff --git a/libsolidity/analysis/Scoper.cpp b/libsolidity/analysis/Scoper.cpp index 98716cf0f867..a14ca4559751 100644 --- a/libsolidity/analysis/Scoper.cpp +++ b/libsolidity/analysis/Scoper.cpp @@ -20,7 +20,6 @@ #include -using namespace std; using namespace solidity; using namespace solidity::frontend; diff --git a/libsolidity/analysis/StaticAnalyzer.cpp b/libsolidity/analysis/StaticAnalyzer.cpp index 01ca601f1222..10c2c922ca47 100644 --- a/libsolidity/analysis/StaticAnalyzer.cpp +++ b/libsolidity/analysis/StaticAnalyzer.cpp @@ -28,7 +28,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; @@ -71,7 +70,7 @@ class solidity::frontend::ConstructorUsesAssembly return m_usesAssembly[&_contract]; } - map m_usesAssembly; + std::map m_usesAssembly; }; StaticAnalyzer::StaticAnalyzer(ErrorReporter& _errorReporter): @@ -124,7 +123,7 @@ void StaticAnalyzer::endVisit(FunctionDefinition const&) 5667_error, var.first.second->location(), "Unused " + - string(var.first.second->isTryCatchParameter() ? "try/catch" : "function") + + std::string(var.first.second->isTryCatchParameter() ? "try/catch" : "function") + " parameter. Remove or comment out the variable name to silence this warning." ); else @@ -142,7 +141,7 @@ bool StaticAnalyzer::visit(Identifier const& _identifier) { solAssert(!var->name().empty(), ""); if (var->isLocalVariable()) - m_localVarUseCount[make_pair(var->id(), var)] += 1; + m_localVarUseCount[std::make_pair(var->id(), var)] += 1; } return true; } @@ -154,7 +153,7 @@ bool StaticAnalyzer::visit(VariableDeclaration const& _variable) solAssert(_variable.isLocalVariable(), ""); if (_variable.name() != "") // This is not a no-op, the entry might pre-exist. - m_localVarUseCount[make_pair(_variable.id(), &_variable)] += 0; + m_localVarUseCount[std::make_pair(_variable.id(), &_variable)] += 0; } if (_variable.isStateVariable() || _variable.referenceLocation() == VariableDeclaration::Location::Storage) @@ -162,7 +161,7 @@ bool StaticAnalyzer::visit(VariableDeclaration const& _variable) for (Type const* type: varType->fullDecomposition()) if (type->storageSizeUpperBound() >= (bigint(1) << 64)) { - string message = "Type " + type->toString(true) + + std::string message = "Type " + type->toString(true) + " covers a large part of storage and thus makes collisions likely." " Either use mappings or dynamic arrays and allow their size to be increased only" " in small quantities per transaction."; @@ -179,7 +178,7 @@ bool StaticAnalyzer::visit(Return const& _return) if (m_currentFunction && _return.expression()) for (auto const& var: m_currentFunction->returnParameters()) if (!var->name().empty()) - m_localVarUseCount[make_pair(var->id(), var.get())] += 1; + m_localVarUseCount[std::make_pair(var->id(), var.get())] += 1; return true; } @@ -214,7 +213,7 @@ bool StaticAnalyzer::visit(MemberAccess const& _memberAccess) else if (type->kind() == MagicType::Kind::MetaType && _memberAccess.memberName() == "runtimeCode") { if (!m_constructorUsesAssembly) - m_constructorUsesAssembly = make_unique(); + m_constructorUsesAssembly = std::make_unique(); ContractType const& contract = dynamic_cast(*type->typeArgument()); if (m_constructorUsesAssembly->check(contract.contractDefinition())) m_errorReporter.warning( @@ -288,7 +287,7 @@ bool StaticAnalyzer::visit(InlineAssembly const& _inlineAssembly) { solAssert(!var->name().empty(), ""); if (var->isLocalVariable()) - m_localVarUseCount[make_pair(var->id(), var)] += 1; + m_localVarUseCount[std::make_pair(var->id(), var)] += 1; } } diff --git a/libsolidity/analysis/SyntaxChecker.cpp b/libsolidity/analysis/SyntaxChecker.cpp index 4f99f67ac623..2546cfdda6bc 100644 --- a/libsolidity/analysis/SyntaxChecker.cpp +++ b/libsolidity/analysis/SyntaxChecker.cpp @@ -32,7 +32,6 @@ #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; @@ -55,17 +54,17 @@ void SyntaxChecker::endVisit(SourceUnit const& _sourceUnit) { if (!m_versionPragmaFound) { - string errorString("Source file does not specify required compiler version!"); - SemVerVersion recommendedVersion{string(VersionString)}; + std::string errorString("Source file does not specify required compiler version!"); + SemVerVersion recommendedVersion{std::string(VersionString)}; if (!recommendedVersion.isPrerelease()) errorString += " Consider adding \"pragma solidity ^" + - to_string(recommendedVersion.major()) + - string(".") + - to_string(recommendedVersion.minor()) + - string(".") + - to_string(recommendedVersion.patch()) + - string(";\""); + std::to_string(recommendedVersion.major()) + + std::string(".") + + std::to_string(recommendedVersion.minor()) + + std::string(".") + + std::to_string(recommendedVersion.patch()) + + std::string(";\""); // when reporting the warning, print the source name only m_errorReporter.warning(3420_error, {-1, -1, _sourceUnit.location().sourceName}, errorString); @@ -84,7 +83,7 @@ bool SyntaxChecker::visit(PragmaDirective const& _pragma) else if (_pragma.literals()[0] == "experimental") { solAssert(m_sourceUnit, ""); - vector literals(_pragma.literals().begin() + 1, _pragma.literals().end()); + std::vector literals(_pragma.literals().begin() + 1, _pragma.literals().end()); if (literals.empty()) m_errorReporter.syntaxError( 9679_error, @@ -99,7 +98,7 @@ bool SyntaxChecker::visit(PragmaDirective const& _pragma) ); else { - string const literal = literals[0]; + std::string const literal = literals[0]; if (literal.empty()) m_errorReporter.syntaxError(3250_error, _pragma.location(), "Empty experimental feature name is invalid."); else if (!ExperimentalFeatureNames.count(literal)) @@ -135,7 +134,7 @@ bool SyntaxChecker::visit(PragmaDirective const& _pragma) solAssert(m_sourceUnit, ""); if ( _pragma.literals().size() != 2 || - !set{"v1", "v2"}.count(_pragma.literals()[1]) + !std::set{"v1", "v2"}.count(_pragma.literals()[1]) ) m_errorReporter.syntaxError( 2745_error, @@ -155,17 +154,17 @@ bool SyntaxChecker::visit(PragmaDirective const& _pragma) { try { - vector tokens(_pragma.tokens().begin() + 1, _pragma.tokens().end()); - vector literals(_pragma.literals().begin() + 1, _pragma.literals().end()); + std::vector tokens(_pragma.tokens().begin() + 1, _pragma.tokens().end()); + std::vector literals(_pragma.literals().begin() + 1, _pragma.literals().end()); SemVerMatchExpressionParser parser(tokens, literals); SemVerMatchExpression matchExpression = parser.parse(); - static SemVerVersion const currentVersion{string(VersionString)}; + static SemVerVersion const currentVersion{std::string(VersionString)}; if (!matchExpression.matches(currentVersion)) m_errorReporter.syntaxError( 3997_error, _pragma.location(), "Source file requires different compiler version (current compiler is " + - string(VersionString) + ") - note that nightly builds are considered to be " + std::string(VersionString) + ") - note that nightly builds are considered to be " "strictly less than the released version" ); m_versionPragmaFound = true; @@ -412,7 +411,7 @@ bool SyntaxChecker::visit(UsingForDirective const& _usingFor) if (!_usingFor.usesBraces()) solAssert( _usingFor.functionsAndOperators().size() == 1 && - !get<1>(_usingFor.functionsAndOperators().front()) + !std::get<1>(_usingFor.functionsAndOperators().front()) ); if (!m_currentContractKind && !_usingFor.typeName()) @@ -455,7 +454,7 @@ bool SyntaxChecker::visit(FunctionDefinition const& _function) if (!_function.isFree() && !_function.isConstructor() && _function.noVisibilitySpecified()) { - string suggestedVisibility = + std::string suggestedVisibility = _function.isFallback() || _function.isReceive() || m_currentContractKind == ContractKind::Interface diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index e7721fd9e5b3..5c28d3cd2a78 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -51,7 +51,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::langutil; @@ -205,7 +204,7 @@ void TypeChecker::checkDoubleStorageAssignment(Assignment const& _assignment) TypePointers TypeChecker::typeCheckABIDecodeAndRetrieveReturnType(FunctionCall const& _functionCall, bool _abiEncoderV2) { - vector> arguments = _functionCall.arguments(); + std::vector> arguments = _functionCall.arguments(); if (arguments.size() != 2) m_errorReporter.typeError( 5782_error, @@ -296,7 +295,7 @@ TypePointers TypeChecker::typeCheckABIDecodeAndRetrieveReturnType(FunctionCall c TypePointers TypeChecker::typeCheckMetaTypeFunctionAndRetrieveReturnType(FunctionCall const& _functionCall) { - vector> arguments = _functionCall.arguments(); + std::vector> arguments = _functionCall.arguments(); if (arguments.size() != 1) m_errorReporter.fatalTypeError( 8885_error, @@ -442,7 +441,7 @@ bool TypeChecker::visit(FunctionDefinition const& _function) m_errorReporter.typeError(5587_error, _function.location(), "\"internal\" and \"private\" functions cannot be payable."); } - vector internalParametersInConstructor; + std::vector internalParametersInConstructor; auto checkArgumentAndReturnParameter = [&](VariableDeclaration const& _var) { if (type(_var)->containsNestedMapping()) @@ -472,7 +471,7 @@ bool TypeChecker::visit(FunctionDefinition const& _function) if (!iType) { - string message = iType.message(); + std::string message = iType.message(); solAssert(!message.empty(), "Expected detailed error message!"); if (_function.isConstructor()) message += " You can make the contract abstract to avoid this problem."; @@ -483,7 +482,7 @@ bool TypeChecker::visit(FunctionDefinition const& _function) !typeSupportedByOldABIEncoder(*type(_var), _function.libraryFunction()) ) { - string message = + std::string message = "This type is only supported in ABI coder v2. " "Use \"pragma abicoder v2;\" to enable the feature."; if (_function.isConstructor()) @@ -509,10 +508,10 @@ bool TypeChecker::visit(FunctionDefinition const& _function) var->accept(*this); } - set modifiers; + std::set modifiers; for (ASTPointer const& modifier: _function.modifiers()) { - vector baseContracts; + std::vector baseContracts; if (auto contract = dynamic_cast(_function.scope())) { baseContracts = contract->annotation().linearizedBaseContracts; @@ -522,7 +521,7 @@ bool TypeChecker::visit(FunctionDefinition const& _function) visitManually( *modifier, - _function.isConstructor() ? baseContracts : vector() + _function.isConstructor() ? baseContracts : std::vector() ); Declaration const* decl = &dereference(modifier->name()); if (modifiers.count(decl)) @@ -642,7 +641,7 @@ bool TypeChecker::visit(VariableDeclaration const& _variable) FunctionType getter(_variable); if (!useABICoderV2()) { - vector unsupportedTypes; + std::vector unsupportedTypes; for (auto const& param: getter.parameterTypes() + getter.returnParameterTypes()) if (!typeSupportedByOldABIEncoder(*param, false /* isLibrary */)) unsupportedTypes.emplace_back(param->humanReadableName()); @@ -713,7 +712,7 @@ void TypeChecker::endVisit(StructDefinition const& _struct) void TypeChecker::visitManually( ModifierInvocation const& _modifier, - vector const& _bases + std::vector const& _bases ) { std::vector> const& arguments = @@ -724,8 +723,8 @@ void TypeChecker::visitManually( _modifier.name().accept(*this); auto const* declaration = &dereference(_modifier.name()); - vector> emptyParameterList; - vector> const* parameters = nullptr; + std::vector> emptyParameterList; + std::vector> const* parameters = nullptr; if (auto modifierDecl = dynamic_cast(declaration)) { parameters = &modifierDecl->parameters(); @@ -920,8 +919,8 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly) if (!identifierInfo.suffix.empty()) { - string const& suffix = identifierInfo.suffix; - solAssert((set{"offset", "slot", "length", "selector", "address"}).count(suffix), ""); + std::string const& suffix = identifierInfo.suffix; + solAssert((std::set{"offset", "slot", "length", "selector", "address"}).count(suffix), ""); if (!var->isConstant() && (var->isStateVariable() || var->type()->dataStoredIn(DataLocation::Storage))) { if (suffix != "slot" && suffix != "offset") @@ -1042,7 +1041,7 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly) return true; }; solAssert(!_inlineAssembly.annotation().analysisInfo, ""); - _inlineAssembly.annotation().analysisInfo = make_shared(); + _inlineAssembly.annotation().analysisInfo = std::make_shared(); yul::AsmAnalyzer analyzer( *_inlineAssembly.annotation().analysisInfo, m_errorReporter, @@ -1113,9 +1112,9 @@ void TypeChecker::endVisit(TryStatement const& _tryStatement) 2800_error, successClause.location(), "Function returns " + - to_string(functionType.returnParameterTypes().size()) + + std::to_string(functionType.returnParameterTypes().size()) + " values, but returns clause has " + - to_string(parameters.size()) + + std::to_string(parameters.size()) + " variables." ); for (auto&& [parameter, returnType]: ranges::views::zip(parameters, returnTypes)) @@ -1363,7 +1362,7 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement) else valueTypes = TypePointers{type(*_statement.initialValue())}; - vector> const& variables = _statement.declarations(); + std::vector> const& variables = _statement.declarations(); if (variables.empty()) // We already have an error for this in the SyntaxChecker. solAssert(m_errorReporter.hasErrors(), ""); @@ -1378,7 +1377,7 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement) ")." ); - for (size_t i = 0; i < min(variables.size(), valueTypes.size()); ++i) + for (size_t i = 0; i < std::min(variables.size(), valueTypes.size()); ++i) { if (!variables[i]) continue; @@ -1535,14 +1534,14 @@ void TypeChecker::checkExpressionAssignment(Type const& _type, Expression const& m_errorReporter.typeError(5547_error, _expression.location(), "Empty tuple on the left hand side."); auto const* tupleType = dynamic_cast(&_type); - auto const& types = tupleType && tupleExpression->components().size() != 1 ? tupleType->components() : vector { &_type }; + auto const& types = tupleType && tupleExpression->components().size() != 1 ? tupleType->components() : std::vector { &_type }; solAssert( tupleExpression->components().size() == types.size() || m_errorReporter.hasErrors(), "Array sizes don't match and no errors generated." ); - for (size_t i = 0; i < min(tupleExpression->components().size(), types.size()); i++) + for (size_t i = 0; i < std::min(tupleExpression->components().size(), types.size()); i++) if (types[i]) { solAssert(!!tupleExpression->components()[i], ""); @@ -1607,7 +1606,7 @@ bool TypeChecker::visit(Assignment const& _assignment) 7366_error, _assignment.location(), "Operator " + - string(TokenTraits::friendlyName(_assignment.assignmentOperator())) + + std::string(TokenTraits::friendlyName(_assignment.assignmentOperator())) + " not compatible with types " + t->humanReadableName() + " and " + @@ -1621,7 +1620,7 @@ bool TypeChecker::visit(Assignment const& _assignment) bool TypeChecker::visit(TupleExpression const& _tuple) { _tuple.annotation().isConstant = false; - vector> const& components = _tuple.components(); + std::vector> const& components = _tuple.components(); TypePointers types; if (_tuple.annotation().willBeWrittenTo) @@ -1734,7 +1733,7 @@ bool TypeChecker::visit(UnaryOperation const& _operation) // Check if the operator is built-in or user-defined. TypeResult builtinResult = operandType->unaryOperatorResult(op); - set matchingDefinitions = operandType->operatorDefinitions( + std::set matchingDefinitions = operandType->operatorDefinitions( op, *currentDefinitionScope(), true // _unary @@ -1760,7 +1759,7 @@ bool TypeChecker::visit(UnaryOperation const& _operation) } else { - string description = fmt::format( + std::string description = fmt::format( "Built-in unary operator {} cannot be applied to type {}.", TokenTraits::friendlyName(op), operandType->humanReadableName() @@ -1802,7 +1801,7 @@ void TypeChecker::endVisit(BinaryOperation const& _operation) // Check if the operator is built-in or user-defined. TypeResult builtinResult = leftType->binaryOperatorResult(_operation.getOperator(), rightType); - set matchingDefinitions = leftType->operatorDefinitions( + std::set matchingDefinitions = leftType->operatorDefinitions( _operation.getOperator(), *currentDefinitionScope(), false // _unary @@ -1828,7 +1827,7 @@ void TypeChecker::endVisit(BinaryOperation const& _operation) } else { - string description = fmt::format( + std::string description = fmt::format( "Built-in binary operator {} cannot be applied to types {} and {}.", TokenTraits::friendlyName(_operation.getOperator()), leftType->humanReadableName(), @@ -1893,7 +1892,7 @@ void TypeChecker::endVisit(BinaryOperation const& _operation) if (_operation.getOperator() == Token::Exp || _operation.getOperator() == Token::SHL) { - string operation = _operation.getOperator() == Token::Exp ? "exponentiation" : "shift"; + std::string operation = _operation.getOperator() == Token::Exp ? "exponentiation" : "shift"; if ( leftType->category() == Type::Category::RationalNumber && rightType->category() != Type::Category::RationalNumber @@ -1933,7 +1932,7 @@ Type const* TypeChecker::typeCheckTypeConversionAndRetrieveReturnType( solAssert(*_functionCall.annotation().kind == FunctionCallKind::TypeConversion, ""); Type const* expressionType = type(_functionCall.expression()); - vector> const& arguments = _functionCall.arguments(); + std::vector> const& arguments = _functionCall.arguments(); bool const isPositionalCall = _functionCall.names().empty(); Type const* resultType = dynamic_cast(*expressionType).actualType(); @@ -2215,7 +2214,7 @@ void TypeChecker::typeCheckABIEncodeFunctions( } // Check additional arguments for variadic functions - vector> const& arguments = _functionCall.arguments(); + std::vector> const& arguments = _functionCall.arguments(); for (size_t i = 0; i < arguments.size(); ++i) { auto const& argType = type(*arguments[i]); @@ -2274,7 +2273,7 @@ void TypeChecker::typeCheckABIEncodeFunctions( void TypeChecker::typeCheckABIEncodeCallFunction(FunctionCall const& _functionCall) { - vector> const& arguments = _functionCall.arguments(); + std::vector> const& arguments = _functionCall.arguments(); // Expecting first argument to be the function pointer and second to be a tuple. if (arguments.size() != 2) @@ -2311,7 +2310,7 @@ void TypeChecker::typeCheckABIEncodeCallFunction(FunctionCall const& _functionCa externalFunctionType->kind() != FunctionType::Kind::Declaration ) { - string msg = "Expected regular external function type, or external view on public function."; + std::string msg = "Expected regular external function type, or external view on public function."; switch (externalFunctionType->kind()) { @@ -2360,7 +2359,7 @@ void TypeChecker::typeCheckABIEncodeCallFunction(FunctionCall const& _functionCa } solAssert(!externalFunctionType->takesArbitraryParameters(), "Function must have fixed parameters."); // Tuples with only one component become that component - vector> callArguments; + std::vector> callArguments; auto const* tupleType = dynamic_cast(type(*arguments[1])); if (tupleType) @@ -2387,9 +2386,9 @@ void TypeChecker::typeCheckABIEncodeCallFunction(FunctionCall const& _functionCa 7788_error, _functionCall.location(), "Expected " + - to_string(externalFunctionType->parameterTypes().size()) + + std::to_string(externalFunctionType->parameterTypes().size()) + " instead of " + - to_string(callArguments.size()) + + std::to_string(callArguments.size()) + " components for the tuple parameter." ); else @@ -2397,13 +2396,13 @@ void TypeChecker::typeCheckABIEncodeCallFunction(FunctionCall const& _functionCa 7515_error, _functionCall.location(), "Expected a tuple with " + - to_string(externalFunctionType->parameterTypes().size()) + + std::to_string(externalFunctionType->parameterTypes().size()) + " components instead of a single non-tuple parameter." ); } // Use min() to check as much as we can before failing fatally - size_t const numParameters = min(callArguments.size(), externalFunctionType->parameterTypes().size()); + size_t const numParameters = std::min(callArguments.size(), externalFunctionType->parameterTypes().size()); for (size_t i = 0; i < numParameters; i++) { @@ -2414,7 +2413,7 @@ void TypeChecker::typeCheckABIEncodeCallFunction(FunctionCall const& _functionCa 5407_error, callArguments[i]->location(), "Cannot implicitly convert component at position " + - to_string(i) + + std::to_string(i) + " from \"" + argType.humanReadableName() + "\" to \"" + @@ -2437,7 +2436,7 @@ void TypeChecker::typeCheckStringConcatFunction( typeCheckFunctionGeneralChecks(_functionCall, _functionType); - for (shared_ptr const& argument: _functionCall.arguments()) + for (std::shared_ptr const& argument: _functionCall.arguments()) { Type const* argumentType = type(*argument); bool notConvertibleToString = !argumentType->isImplicitlyConvertibleTo(*TypeProvider::stringMemory()); @@ -2464,7 +2463,7 @@ void TypeChecker::typeCheckBytesConcatFunction( typeCheckFunctionGeneralChecks(_functionCall, _functionType); - for (shared_ptr const& argument: _functionCall.arguments()) + for (std::shared_ptr const& argument: _functionCall.arguments()) { Type const* argumentType = type(*argument); bool notConvertibleToBytes = @@ -2504,8 +2503,8 @@ void TypeChecker::typeCheckFunctionGeneralChecks( ); TypePointers const& parameterTypes = _functionType->parameterTypes(); - vector> const& arguments = _functionCall.arguments(); - vector> const& argumentNames = _functionCall.names(); + std::vector> const& arguments = _functionCall.arguments(); + std::vector> const& argumentNames = _functionCall.names(); // Check number of passed in arguments if ( @@ -2516,22 +2515,22 @@ void TypeChecker::typeCheckFunctionGeneralChecks( bool const isStructConstructorCall = functionCallKind == FunctionCallKind::StructConstructorCall; - auto [errorId, description] = [&]() -> tuple { - string msg = isVariadic ? + auto [errorId, description] = [&]() -> std::tuple { + std::string msg = isVariadic ? "Need at least " + toString(parameterTypes.size()) + " arguments for " + - string(isStructConstructorCall ? "struct constructor" : "function call") + + std::string(isStructConstructorCall ? "struct constructor" : "function call") + ", but provided only " + toString(arguments.size()) + "." : "Wrong argument count for " + - string(isStructConstructorCall ? "struct constructor" : "function call") + + std::string(isStructConstructorCall ? "struct constructor" : "function call") + ": " + toString(arguments.size()) + " arguments given but " + - string(isVariadic ? "need at least " : "expected ") + + std::string(isVariadic ? "need at least " : "expected ") + toString(parameterTypes.size()) + "."; @@ -2659,8 +2658,8 @@ void TypeChecker::typeCheckFunctionGeneralChecks( BoolResult result = type(*paramArgMap[i])->isImplicitlyConvertibleTo(*parameterTypes[i]); if (!result) { - auto [errorId, description] = [&]() -> tuple { - string msg = + auto [errorId, description] = [&]() -> std::tuple { + std::string msg = "Invalid type for argument in function call. " "Invalid implicit conversion from " + type(*paramArgMap[i])->humanReadableName() + @@ -2751,7 +2750,7 @@ void TypeChecker::typeCheckFunctionGeneralChecks( bool TypeChecker::visit(FunctionCall const& _functionCall) { - vector> const& arguments = _functionCall.arguments(); + std::vector> const& arguments = _functionCall.arguments(); bool argumentsArePure = true; // We need to check arguments' type first as they will be needed for overload resolution. @@ -2991,7 +2990,7 @@ bool TypeChecker::visit(FunctionCallOptions const& _functionCallOptions) "{...}-option." ); - auto setCheckOption = [&](bool& _option, string const& _name) + auto setCheckOption = [&](bool& _option, std::string const& _name) { if (_option) m_errorReporter.typeError( @@ -3005,7 +3004,7 @@ bool TypeChecker::visit(FunctionCallOptions const& _functionCallOptions) for (size_t i = 0; i < _functionCallOptions.names().size(); ++i) { - string const& name = *(_functionCallOptions.names()[i]); + std::string const& name = *(_functionCallOptions.names()[i]); if (name == "salt") { if (kind == FunctionType::Kind::Creation) @@ -3185,8 +3184,8 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess) ); } - auto [errorId, description] = [&]() -> tuple { - string errorMsg = "Member \"" + memberName + "\" not found or not visible " + auto [errorId, description] = [&]() -> std::tuple { + std::string errorMsg = "Member \"" + memberName + "\" not found or not visible " "after argument-dependent lookup in " + exprType->humanReadableName() + "."; if (auto const* funType = dynamic_cast(exprType)) @@ -3222,7 +3221,7 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess) if (addressMember.name == memberName) { auto const* var = dynamic_cast(&_memberAccess.expression()); - string varName = var ? var->name() : "..."; + std::string varName = var ? var->name() : "..."; errorMsg += " Use \"address(" + varName + ")." + memberName + "\" to access this address member."; return { 3125_error, errorMsg }; } @@ -3606,13 +3605,13 @@ bool TypeChecker::visit(IndexRangeAccess const& _access) return false; } -vector TypeChecker::cleanOverloadedDeclarations( +std::vector TypeChecker::cleanOverloadedDeclarations( Identifier const& _identifier, - vector const& _candidates + std::vector const& _candidates ) { solAssert(_candidates.size() > 1, ""); - vector uniqueDeclarations; + std::vector uniqueDeclarations; for (Declaration const* declaration: _candidates) { @@ -3665,7 +3664,7 @@ bool TypeChecker::visit(Identifier const& _identifier) else if (!annotation.arguments) { // The identifier should be a public state variable shadowing other functions - vector candidates; + std::vector candidates; for (Declaration const* declaration: annotation.overloadedDeclarations) { @@ -3681,7 +3680,7 @@ bool TypeChecker::visit(Identifier const& _identifier) } else { - vector candidates; + std::vector candidates; for (Declaration const* declaration: annotation.overloadedDeclarations) { @@ -3700,7 +3699,7 @@ bool TypeChecker::visit(Identifier const& _identifier) if (!declaration->location().isValid()) { // Try to re-construct function definition - string description; + std::string description; for (auto const& param: declaration->functionType(true)->parameterTypes()) description += (description.empty() ? "" : ", ") + param->humanReadableName(); description = "function " + _identifier.name() + "(" + description + ")"; @@ -3816,12 +3815,12 @@ void TypeChecker::endVisit(Literal const& _literal) // Assign type here if it even looks like an address. This prevents double errors for invalid addresses _literal.annotation().type = TypeProvider::address(); - string msg; + std::string msg; if (_literal.valueWithoutUnderscores().length() != 42) // "0x" + 40 hex digits // looksLikeAddress enforces that it is a hex literal starting with "0x" msg = "This looks like an address but is not exactly 40 hex digits. It is " + - to_string(_literal.valueWithoutUnderscores().length() - 2) + + std::to_string(_literal.valueWithoutUnderscores().length() - 2) + " hex digits."; else if (!_literal.passesAddressChecksum()) { @@ -4034,7 +4033,7 @@ void TypeChecker::endVisit(UsingForDirective const& _usingFor) bool isBinaryOnlyOperator = (TokenTraits::isBinaryOp(operator_.value()) && !TokenTraits::isUnaryOp(operator_.value())); bool firstParameterMatchesUsingFor = parameterCount == 0 || *usingForType == *parameterTypes.front(); - optional wrongParametersMessage; + std::optional wrongParametersMessage; if (isBinaryOnlyOperator && (parameterCount != 2 || !identicalFirstTwoParameters)) wrongParametersMessage = fmt::format("two parameters of type {} and the same data location", usingForType->canonicalName()); else if (isUnaryOnlyOperator && (parameterCount != 1 || !firstParameterMatchesUsingFor)) @@ -4065,7 +4064,7 @@ void TypeChecker::endVisit(UsingForDirective const& _usingFor) TypePointers const& returnParameterTypes = functionType->returnParameterTypes(); size_t const returnParameterCount = returnParameterTypes.size(); - optional wrongReturnParametersMessage; + std::optional wrongReturnParametersMessage; if (!TokenTraits::isCompareOp(operator_.value()) && operator_.value() != Token::Not) { if (returnParameterCount != 1 || *usingForType != *returnParameterTypes.front()) @@ -4100,7 +4099,7 @@ void TypeChecker::endVisit(UsingForDirective const& _usingFor) { // TODO: This is pretty inefficient. For every operator binding we find, we're // traversing all bindings in all `using for` directives in the current scope. - set matchingDefinitions = usingForType->operatorDefinitions( + std::set matchingDefinitions = usingForType->operatorDefinitions( operator_.value(), *currentDefinitionScope(), parameterCount == 1 // _unary @@ -4133,7 +4132,7 @@ void TypeChecker::endVisit(UsingForDirective const& _usingFor) void TypeChecker::checkErrorAndEventParameters(CallableDeclaration const& _callable) { - string kind = dynamic_cast(&_callable) ? "event" : "error"; + std::string kind = dynamic_cast(&_callable) ? "event" : "error"; for (ASTPointer const& var: _callable.parameters()) { if (type(*var)->containsNestedMapping()) @@ -4223,7 +4222,7 @@ void TypeChecker::requireLValue(Expression const& _expression, bool _ordinaryAss if (*_expression.annotation().isLValue) return; - auto [errorId, description] = [&]() -> tuple { + auto [errorId, description] = [&]() -> std::tuple { if (*_expression.annotation().isConstant) return { 6520_error, "Cannot assign to a constant variable." }; diff --git a/libsolidity/analysis/ViewPureChecker.cpp b/libsolidity/analysis/ViewPureChecker.cpp index c370f8f9f149..3f6b954e75da 100644 --- a/libsolidity/analysis/ViewPureChecker.cpp +++ b/libsolidity/analysis/ViewPureChecker.cpp @@ -27,7 +27,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; @@ -312,13 +311,13 @@ ViewPureChecker::MutabilityAndLocation const& ViewPureChecker::modifierMutabilit { MutabilityAndLocation bestMutabilityAndLocation{}; FunctionDefinition const* currentFunction = nullptr; - swap(bestMutabilityAndLocation, m_bestMutabilityAndLocation); - swap(currentFunction, m_currentFunction); + std::swap(bestMutabilityAndLocation, m_bestMutabilityAndLocation); + std::swap(currentFunction, m_currentFunction); _modifier.accept(*this); - swap(bestMutabilityAndLocation, m_bestMutabilityAndLocation); - swap(currentFunction, m_currentFunction); + std::swap(bestMutabilityAndLocation, m_bestMutabilityAndLocation); + std::swap(currentFunction, m_currentFunction); } return m_inferredMutability.at(&_modifier); } @@ -384,8 +383,8 @@ void ViewPureChecker::endVisit(MemberAccess const& _memberAccess) break; case Type::Category::Magic: { - using MagicMember = pair; - set static const pureMembers{ + using MagicMember = std::pair; + std::set static const pureMembers{ {MagicType::Kind::ABI, "decode"}, {MagicType::Kind::ABI, "encode"}, {MagicType::Kind::ABI, "encodePacked"}, @@ -401,7 +400,7 @@ void ViewPureChecker::endVisit(MemberAccess const& _memberAccess) {MagicType::Kind::MetaType, "min"}, {MagicType::Kind::MetaType, "max"}, }; - set static const payableMembers{ + std::set static const payableMembers{ {MagicType::Kind::Message, "value"} }; diff --git a/scripts/check_style.sh b/scripts/check_style.sh index 34fbf0381bf7..a396a7d76059 100755 --- a/scripts/check_style.sh +++ b/scripts/check_style.sh @@ -25,6 +25,7 @@ NAMESPACE_STD_FREE_FILES=( liblangutil/* libsmtutil/* libsolc/* + libsolidity/analysis/* ) ( From 2a2a9d37ee69ca77ef530fe18524a3dc8b053104 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Mon, 14 Aug 2023 14:39:16 +0200 Subject: [PATCH 034/150] Purge using namespace std from libsolidity/ast --- libsolidity/ast/AST.cpp | 81 +++-- libsolidity/ast/ASTAnnotations.cpp | 1 - libsolidity/ast/ASTJsonExporter.cpp | 485 ++++++++++++++-------------- libsolidity/ast/ASTJsonImporter.cpp | 116 ++++--- libsolidity/ast/CallGraph.cpp | 15 +- libsolidity/ast/TypeProvider.cpp | 251 +++++++------- libsolidity/ast/Types.cpp | 387 +++++++++++----------- scripts/check_style.sh | 3 +- 8 files changed, 666 insertions(+), 673 deletions(-) diff --git a/libsolidity/ast/AST.cpp b/libsolidity/ast/AST.cpp index 833ba739e146..c0bf9009186d 100644 --- a/libsolidity/ast/AST.cpp +++ b/libsolidity/ast/AST.cpp @@ -39,13 +39,12 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::frontend; namespace { -TryCatchClause const* findClause(vector> const& _clauses, optional _errorName = {}) +TryCatchClause const* findClause(std::vector> const& _clauses, std::optional _errorName = {}) { for (auto const& clause: ranges::views::tail(_clauses)) if (_errorName.has_value() ? clause->errorName() == _errorName : clause->errorName().empty()) @@ -119,7 +118,7 @@ FunctionDefinition const* ASTNode::resolveFunctionCall(FunctionCall const& _func ASTAnnotation& ASTNode::annotation() const { if (!m_annotation) - m_annotation = make_unique(); + m_annotation = std::make_unique(); return *m_annotation; } @@ -128,9 +127,9 @@ SourceUnitAnnotation& SourceUnit::annotation() const return initAnnotation(); } -set SourceUnit::referencedSourceUnits(bool _recurse, set _skipList) const +std::set SourceUnit::referencedSourceUnits(bool _recurse, std::set _skipList) const { - set sourceUnits; + std::set sourceUnits; for (ImportDirective const* importDirective: filteredNodes(nodes())) { auto const& sourceUnit = importDirective->annotation().sourceUnit; @@ -161,11 +160,11 @@ bool ContractDefinition::derivesFrom(ContractDefinition const& _base) const return util::contains(annotation().linearizedBaseContracts, &_base); } -map, FunctionTypePointer> ContractDefinition::interfaceFunctions(bool _includeInheritedFunctions) const +std::map, FunctionTypePointer> ContractDefinition::interfaceFunctions(bool _includeInheritedFunctions) const { auto exportedFunctionList = interfaceFunctionList(_includeInheritedFunctions); - map, FunctionTypePointer> exportedFunctions; + std::map, FunctionTypePointer> exportedFunctions; for (auto const& it: exportedFunctionList) exportedFunctions.insert(it); @@ -208,11 +207,11 @@ FunctionDefinition const* ContractDefinition::receiveFunction() const return nullptr; } -vector const& ContractDefinition::definedInterfaceEvents() const +std::vector const& ContractDefinition::definedInterfaceEvents() const { return m_interfaceEvents.init([&]{ - set eventsSeen; - vector interfaceEvents; + std::set eventsSeen; + std::vector interfaceEvents; for (ContractDefinition const* contract: annotation().linearizedBaseContracts) for (EventDefinition const* e: contract->events()) @@ -222,7 +221,7 @@ vector const& ContractDefinition::definedInterfaceEvents /// and not to function encoding (jump vs. call) FunctionType const* functionType = e->functionType(true); solAssert(functionType, ""); - string eventSignature = functionType->externalSignature(); + std::string eventSignature = functionType->externalSignature(); if (eventsSeen.count(eventSignature) == 0) { eventsSeen.insert(eventSignature); @@ -233,7 +232,7 @@ vector const& ContractDefinition::definedInterfaceEvents }); } -vector const ContractDefinition::usedInterfaceEvents() const +std::vector const ContractDefinition::usedInterfaceEvents() const { solAssert(annotation().creationCallGraph.set(), ""); @@ -243,9 +242,9 @@ vector const ContractDefinition::usedInterfaceEvents() c ); } -vector ContractDefinition::interfaceEvents(bool _requireCallGraph) const +std::vector ContractDefinition::interfaceEvents(bool _requireCallGraph) const { - set result; + std::set result; for (ContractDefinition const* contract: annotation().linearizedBaseContracts) result += contract->events(); solAssert(annotation().creationCallGraph.set() == annotation().deployedCallGraph.set()); @@ -255,12 +254,12 @@ vector ContractDefinition::interfaceEvents(bool _require result += usedInterfaceEvents(); // We could filter out all events that do not have an external interface // if _requireCallGraph is false. - return util::convertContainer>(std::move(result)); + return util::convertContainer>(std::move(result)); } -vector ContractDefinition::interfaceErrors(bool _requireCallGraph) const +std::vector ContractDefinition::interfaceErrors(bool _requireCallGraph) const { - set result; + std::set result; for (ContractDefinition const* contract: annotation().linearizedBaseContracts) result += filteredNodes(contract->m_subNodes); solAssert(annotation().creationCallGraph.set() == annotation().deployedCallGraph.set(), ""); @@ -270,20 +269,20 @@ vector ContractDefinition::interfaceErrors(bool _require result += (*annotation().creationCallGraph)->usedErrors + (*annotation().deployedCallGraph)->usedErrors; - return util::convertContainer>(std::move(result)); + return util::convertContainer>(std::move(result)); } -vector, FunctionTypePointer>> const& ContractDefinition::interfaceFunctionList(bool _includeInheritedFunctions) const +std::vector, FunctionTypePointer>> const& ContractDefinition::interfaceFunctionList(bool _includeInheritedFunctions) const { return m_interfaceFunctionList[_includeInheritedFunctions].init([&]{ - set signaturesSeen; - vector, FunctionTypePointer>> interfaceFunctionList; + std::set signaturesSeen; + std::vector, FunctionTypePointer>> interfaceFunctionList; for (ContractDefinition const* contract: annotation().linearizedBaseContracts) { if (_includeInheritedFunctions == false && contract != this) continue; - vector functions; + std::vector functions; for (FunctionDefinition const* f: contract->definedFunctions()) if (f->isPartOfExternalInterface()) functions.push_back(TypeProvider::function(*f, FunctionType::Kind::External)); @@ -295,7 +294,7 @@ vector, FunctionTypePointer>> const& ContractDefinition: if (!fun->interfaceFunctionType()) // Fails hopefully because we already registered the error continue; - string functionSignature = fun->externalSignature(); + std::string functionSignature = fun->externalSignature(); if (signaturesSeen.count(functionSignature) == 0) { signaturesSeen.insert(functionSignature); @@ -357,7 +356,7 @@ FunctionDefinition const* ContractDefinition::nextConstructor(ContractDefinition return nullptr; } -multimap const& ContractDefinition::definedFunctionsByName() const +std::multimap const& ContractDefinition::definedFunctionsByName() const { return m_definedFunctionsByName.init([&]{ std::multimap result; @@ -386,7 +385,7 @@ TypeDeclarationAnnotation& UserDefinedValueTypeDefinition::annotation() const std::vector, std::optional>> UsingForDirective::functionsAndOperators() const { - return ranges::zip_view(m_functionsOrLibrary, m_operators) | ranges::to; + return ranges::zip_view(m_functionsOrLibrary, m_operators) | ranges::to; } Type const* StructDefinition::type() const @@ -484,12 +483,12 @@ Type const* FunctionDefinition::typeViaContractName() const return TypeProvider::function(*this, FunctionType::Kind::Declaration); } -string FunctionDefinition::externalSignature() const +std::string FunctionDefinition::externalSignature() const { return TypeProvider::function(*this)->externalSignature(); } -string FunctionDefinition::externalIdentifierHex() const +std::string FunctionDefinition::externalIdentifierHex() const { return TypeProvider::function(*this)->externalIdentifierHex(); } @@ -639,7 +638,7 @@ CallableDeclaration const* Scopable::functionOrModifierDefinition() const return nullptr; } -string Scopable::sourceUnitName() const +std::string Scopable::sourceUnitName() const { return *sourceUnit().annotation().path; } @@ -701,7 +700,7 @@ bool VariableDeclaration::isCallableOrCatchParameter() const if (isReturnParameter() || isTryCatchParameter()) return true; - vector> const* parameters = nullptr; + std::vector> const* parameters = nullptr; if (auto const* funTypeName = dynamic_cast(scope())) parameters = &funTypeName->parameterTypes(); @@ -722,7 +721,7 @@ bool VariableDeclaration::isLocalOrReturn() const bool VariableDeclaration::isReturnParameter() const { - vector> const* returnParameters = nullptr; + std::vector> const* returnParameters = nullptr; if (auto const* funTypeName = dynamic_cast(scope())) returnParameters = &funTypeName->returnParameterTypes(); @@ -813,15 +812,15 @@ bool VariableDeclaration::isFileLevelVariable() const return dynamic_cast(scope()); } -set VariableDeclaration::allowedDataLocations() const +std::set VariableDeclaration::allowedDataLocations() const { using Location = VariableDeclaration::Location; if (!hasReferenceOrMappingType() || isStateVariable() || isEventOrErrorParameter()) - return set{ Location::Unspecified }; + return std::set{ Location::Unspecified }; else if (isCallableOrCatchParameter()) { - set locations{ Location::Memory }; + std::set locations{ Location::Memory }; if ( isConstructorParameter() || isInternalCallableParameter() || @@ -835,13 +834,13 @@ set VariableDeclaration::allowedDataLocations() c } else if (isLocalVariable()) // Further restrictions will be imposed later on. - return set{ Location::Memory, Location::Storage, Location::CallData }; + return std::set{ Location::Memory, Location::Storage, Location::CallData }; else // Struct members etc. - return set{ Location::Unspecified }; + return std::set{ Location::Unspecified }; } -string VariableDeclaration::externalIdentifierHex() const +std::string VariableDeclaration::externalIdentifierHex() const { solAssert(isStateVariable() && isPublic(), "Can only be called for public state variables"); return TypeProvider::function(*this)->externalIdentifierHex(); @@ -958,7 +957,7 @@ FunctionCallAnnotation& FunctionCall::annotation() const return initAnnotation(); } -vector> FunctionCall::sortedArguments() const +std::vector> FunctionCall::sortedArguments() const { // normal arguments if (m_names.empty()) @@ -975,7 +974,7 @@ vector> FunctionCall::sortedArguments() const else functionType = dynamic_cast(m_expression->annotation().type); - vector> sorted; + std::vector> sorted; for (auto const& parameterName: functionType->parameterNames()) { bool found = false; @@ -1030,13 +1029,13 @@ bool Literal::passesAddressChecksum() const return util::passesAddressChecksum(valueWithoutUnderscores(), true); } -string Literal::getChecksummedAddress() const +std::string Literal::getChecksummedAddress() const { solAssert(isHexNumber(), "Expected hex number"); /// Pad literal to be a proper hex address. - string address = valueWithoutUnderscores().substr(2); + std::string address = valueWithoutUnderscores().substr(2); if (address.length() > 40) - return string(); + return std::string(); address.insert(address.begin(), 40 - address.size(), '0'); return util::getChecksummedAddress(address); } diff --git a/libsolidity/ast/ASTAnnotations.cpp b/libsolidity/ast/ASTAnnotations.cpp index 3556041d849c..84d49fa2fd37 100644 --- a/libsolidity/ast/ASTAnnotations.cpp +++ b/libsolidity/ast/ASTAnnotations.cpp @@ -23,7 +23,6 @@ #include -using namespace std; using namespace solidity; using namespace solidity::frontend; diff --git a/libsolidity/ast/ASTJsonExporter.cpp b/libsolidity/ast/ASTJsonExporter.cpp index da7f769362fe..ac847a339432 100644 --- a/libsolidity/ast/ASTJsonExporter.cpp +++ b/libsolidity/ast/ASTJsonExporter.cpp @@ -44,7 +44,6 @@ #include #include -using namespace std; using namespace std::string_literals; using namespace solidity::langutil; @@ -52,14 +51,14 @@ namespace { template typename C> -void addIfSet(std::vector>& _attributes, string const& _name, C const& _value) +void addIfSet(std::vector>& _attributes, std::string const& _name, C const& _value) { if constexpr (std::is_same_v, solidity::util::SetOnce>) { if (!_value.set()) return; } - else if constexpr (std::is_same_v, optional>) + else if constexpr (std::is_same_v, std::optional>) { if (!_value.has_value()) return; @@ -73,7 +72,7 @@ void addIfSet(std::vector>& _attributes, string const& namespace solidity::frontend { -ASTJsonExporter::ASTJsonExporter(CompilerStack::State _stackState, map _sourceIndices): +ASTJsonExporter::ASTJsonExporter(CompilerStack::State _stackState, std::map _sourceIndices): m_stackState(_stackState), m_sourceIndices(std::move(_sourceIndices)) { @@ -82,21 +81,21 @@ ASTJsonExporter::ASTJsonExporter(CompilerStack::State _stackState, map>&& _attributes + std::string const& _nodeName, + std::initializer_list>&& _attributes ) { ASTJsonExporter::setJsonNode( _node, _nodeName, - std::vector>(std::move(_attributes)) + std::vector>(std::move(_attributes)) ); } void ASTJsonExporter::setJsonNode( ASTNode const& _node, - string const& _nodeType, - std::vector>&& _attributes + std::string const& _nodeType, + std::vector>&& _attributes ) { m_currentValue = Json::objectValue; @@ -110,24 +109,24 @@ void ASTJsonExporter::setJsonNode( m_currentValue[e.first] = std::move(e.second); } -optional ASTJsonExporter::sourceIndexFromLocation(SourceLocation const& _location) const +std::optional ASTJsonExporter::sourceIndexFromLocation(SourceLocation const& _location) const { if (_location.sourceName && m_sourceIndices.count(*_location.sourceName)) return m_sourceIndices.at(*_location.sourceName); else - return nullopt; + return std::nullopt; } -string ASTJsonExporter::sourceLocationToString(SourceLocation const& _location) const +std::string ASTJsonExporter::sourceLocationToString(SourceLocation const& _location) const { - optional sourceIndexOpt = sourceIndexFromLocation(_location); + std::optional sourceIndexOpt = sourceIndexFromLocation(_location); int length = -1; if (_location.start >= 0 && _location.end >= 0) length = _location.end - _location.start; - return to_string(_location.start) + ":" + to_string(length) + ":" + (sourceIndexOpt.has_value() ? to_string(sourceIndexOpt.value()) : "-1"); + return std::to_string(_location.start) + ":" + std::to_string(length) + ":" + (sourceIndexOpt.has_value() ? std::to_string(sourceIndexOpt.value()) : "-1"); } -Json::Value ASTJsonExporter::sourceLocationsToJson(vector const& _sourceLocations) const +Json::Value ASTJsonExporter::sourceLocationsToJson(std::vector const& _sourceLocations) const { Json::Value locations = Json::arrayValue; @@ -137,7 +136,7 @@ Json::Value ASTJsonExporter::sourceLocationsToJson(vector const& return locations; } -string ASTJsonExporter::namePathToString(std::vector const& _namePath) +std::string ASTJsonExporter::namePathToString(std::vector const& _namePath) { return boost::algorithm::join(_namePath, "."s); } @@ -164,13 +163,13 @@ Json::Value ASTJsonExporter::typePointerToJson(std::optional } void ASTJsonExporter::appendExpressionAttributes( - std::vector>& _attributes, + std::vector>& _attributes, ExpressionAnnotation const& _annotation ) { - std::vector> exprAttributes = { - make_pair("typeDescriptions", typePointerToJson(_annotation.type)), - make_pair("argumentTypes", typePointerToJson(_annotation.arguments)) + std::vector> exprAttributes = { + std::make_pair("typeDescriptions", typePointerToJson(_annotation.type)), + std::make_pair("argumentTypes", typePointerToJson(_annotation.arguments)) }; addIfSet(exprAttributes, "isLValue", _annotation.isLValue); @@ -183,7 +182,7 @@ void ASTJsonExporter::appendExpressionAttributes( _attributes += exprAttributes; } -Json::Value ASTJsonExporter::inlineAssemblyIdentifierToJson(pair _info) const +Json::Value ASTJsonExporter::inlineAssemblyIdentifierToJson(std::pair _info) const { Json::Value tuple(Json::objectValue); tuple["src"] = sourceLocationToString(nativeLocationOf(*_info.first)); @@ -199,7 +198,7 @@ Json::Value ASTJsonExporter::inlineAssemblyIdentifierToJson(pair> attributes = { - make_pair("license", _node.licenseString() ? Json::Value(*_node.licenseString()) : Json::nullValue), - make_pair("nodes", toJson(_node.nodes())), + std::vector> attributes = { + std::make_pair("license", _node.licenseString() ? Json::Value(*_node.licenseString()) : Json::nullValue), + std::make_pair("nodes", toJson(_node.nodes())), }; if (_node.experimentalSolidity()) @@ -246,17 +245,17 @@ bool ASTJsonExporter::visit(PragmaDirective const& _node) for (auto const& literal: _node.literals()) literals.append(literal); setJsonNode(_node, "PragmaDirective", { - make_pair("literals", std::move(literals)) + std::make_pair("literals", std::move(literals)) }); return false; } bool ASTJsonExporter::visit(ImportDirective const& _node) { - std::vector> attributes = { - make_pair("file", _node.path()), - make_pair("sourceUnit", idOrNull(_node.annotation().sourceUnit)), - make_pair("scope", idOrNull(_node.scope())) + std::vector> attributes = { + std::make_pair("file", _node.path()), + std::make_pair("sourceUnit", idOrNull(_node.annotation().sourceUnit)), + std::make_pair("scope", idOrNull(_node.scope())) }; addIfSet(attributes, "absolutePath", _node.annotation().absolutePath); @@ -281,19 +280,19 @@ bool ASTJsonExporter::visit(ImportDirective const& _node) bool ASTJsonExporter::visit(ContractDefinition const& _node) { - std::vector> attributes = { - make_pair("name", _node.name()), - make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), - make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), - make_pair("contractKind", contractKind(_node.contractKind())), - make_pair("abstract", _node.abstract()), - make_pair("baseContracts", toJson(_node.baseContracts())), - make_pair("contractDependencies", getContainerIds(_node.annotation().contractDependencies | ranges::views::keys)), + std::vector> attributes = { + std::make_pair("name", _node.name()), + std::make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), + std::make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), + std::make_pair("contractKind", contractKind(_node.contractKind())), + std::make_pair("abstract", _node.abstract()), + std::make_pair("baseContracts", toJson(_node.baseContracts())), + std::make_pair("contractDependencies", getContainerIds(_node.annotation().contractDependencies | ranges::views::keys)), // Do not require call graph because the AST is also created for incorrect sources. - make_pair("usedEvents", getContainerIds(_node.interfaceEvents(false))), - make_pair("usedErrors", getContainerIds(_node.interfaceErrors(false))), - make_pair("nodes", toJson(_node.subNodes())), - make_pair("scope", idOrNull(_node.scope())) + std::make_pair("usedEvents", getContainerIds(_node.interfaceEvents(false))), + std::make_pair("usedErrors", getContainerIds(_node.interfaceErrors(false))), + std::make_pair("nodes", toJson(_node.subNodes())), + std::make_pair("scope", idOrNull(_node.scope())) }; addIfSet(attributes, "canonicalName", _node.annotation().canonicalName); @@ -306,7 +305,7 @@ bool ASTJsonExporter::visit(ContractDefinition const& _node) { Json::Value internalFunctionIDs(Json::objectValue); for (auto const& [functionDefinition, internalFunctionID]: _node.annotation().internalFunctionIDs) - internalFunctionIDs[to_string(functionDefinition->id())] = internalFunctionID; + internalFunctionIDs[std::to_string(functionDefinition->id())] = internalFunctionID; attributes.emplace_back("internalFunctionIDs", std::move(internalFunctionIDs)); } @@ -322,9 +321,9 @@ bool ASTJsonExporter::visit(IdentifierPath const& _node) nameLocations.append(sourceLocationToString(location)); setJsonNode(_node, "IdentifierPath", { - make_pair("name", namePathToString(_node.path())), - make_pair("nameLocations", nameLocations), - make_pair("referencedDeclaration", idOrNull(_node.annotation().referencedDeclaration)) + std::make_pair("name", namePathToString(_node.path())), + std::make_pair("nameLocations", nameLocations), + std::make_pair("referencedDeclaration", idOrNull(_node.annotation().referencedDeclaration)) }); return false; } @@ -332,16 +331,16 @@ bool ASTJsonExporter::visit(IdentifierPath const& _node) bool ASTJsonExporter::visit(InheritanceSpecifier const& _node) { setJsonNode(_node, "InheritanceSpecifier", { - make_pair("baseName", toJson(_node.name())), - make_pair("arguments", _node.arguments() ? toJson(*_node.arguments()) : Json::nullValue) + std::make_pair("baseName", toJson(_node.name())), + std::make_pair("arguments", _node.arguments() ? toJson(*_node.arguments()) : Json::nullValue) }); return false; } bool ASTJsonExporter::visit(UsingForDirective const& _node) { - vector> attributes = { - make_pair("typeName", _node.typeName() ? toJson(*_node.typeName()) : Json::nullValue) + std::vector> attributes = { + std::make_pair("typeName", _node.typeName() ? toJson(*_node.typeName()) : Json::nullValue) }; if (_node.usesBraces()) @@ -355,7 +354,7 @@ bool ASTJsonExporter::visit(UsingForDirective const& _node) else { functionNode["definition"] = toJson(*function); - functionNode["operator"] = string(TokenTraits::toString(*op)); + functionNode["operator"] = std::string(TokenTraits::toString(*op)); } functionList.append(std::move(functionNode)); } @@ -377,13 +376,13 @@ bool ASTJsonExporter::visit(UsingForDirective const& _node) bool ASTJsonExporter::visit(StructDefinition const& _node) { - std::vector> attributes = { - make_pair("name", _node.name()), - make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), - make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), - make_pair("visibility", Declaration::visibilityToString(_node.visibility())), - make_pair("members", toJson(_node.members())), - make_pair("scope", idOrNull(_node.scope())) + std::vector> attributes = { + std::make_pair("name", _node.name()), + std::make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), + std::make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), + std::make_pair("visibility", Declaration::visibilityToString(_node.visibility())), + std::make_pair("members", toJson(_node.members())), + std::make_pair("scope", idOrNull(_node.scope())) }; addIfSet(attributes,"canonicalName", _node.annotation().canonicalName); @@ -395,11 +394,11 @@ bool ASTJsonExporter::visit(StructDefinition const& _node) bool ASTJsonExporter::visit(EnumDefinition const& _node) { - std::vector> attributes = { - make_pair("name", _node.name()), - make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), - make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), - make_pair("members", toJson(_node.members())) + std::vector> attributes = { + std::make_pair("name", _node.name()), + std::make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), + std::make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), + std::make_pair("members", toJson(_node.members())) }; addIfSet(attributes,"canonicalName", _node.annotation().canonicalName); @@ -412,8 +411,8 @@ bool ASTJsonExporter::visit(EnumDefinition const& _node) bool ASTJsonExporter::visit(EnumValue const& _node) { setJsonNode(_node, "EnumValue", { - make_pair("name", _node.name()), - make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), + std::make_pair("name", _node.name()), + std::make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), }); return false; } @@ -421,10 +420,10 @@ bool ASTJsonExporter::visit(EnumValue const& _node) bool ASTJsonExporter::visit(UserDefinedValueTypeDefinition const& _node) { solAssert(_node.underlyingType(), ""); - std::vector> attributes = { - make_pair("name", _node.name()), - make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), - make_pair("underlyingType", toJson(*_node.underlyingType())) + std::vector> attributes = { + std::make_pair("name", _node.name()), + std::make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), + std::make_pair("underlyingType", toJson(*_node.underlyingType())) }; addIfSet(attributes, "canonicalName", _node.annotation().canonicalName); @@ -436,7 +435,7 @@ bool ASTJsonExporter::visit(UserDefinedValueTypeDefinition const& _node) bool ASTJsonExporter::visit(ParameterList const& _node) { setJsonNode(_node, "ParameterList", { - make_pair("parameters", toJson(_node.parameters())) + std::make_pair("parameters", toJson(_node.parameters())) }); return false; } @@ -444,30 +443,30 @@ bool ASTJsonExporter::visit(ParameterList const& _node) bool ASTJsonExporter::visit(OverrideSpecifier const& _node) { setJsonNode(_node, "OverrideSpecifier", { - make_pair("overrides", toJson(_node.overrides())) + std::make_pair("overrides", toJson(_node.overrides())) }); return false; } bool ASTJsonExporter::visit(FunctionDefinition const& _node) { - std::vector> attributes = { - make_pair("name", _node.name()), - make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), - make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), - make_pair("kind", _node.isFree() ? "freeFunction" : TokenTraits::toString(_node.kind())), - make_pair("stateMutability", stateMutabilityToString(_node.stateMutability())), - make_pair("virtual", _node.markedVirtual()), - make_pair("overrides", _node.overrides() ? toJson(*_node.overrides()) : Json::nullValue), - make_pair("parameters", toJson(_node.parameterList())), - make_pair("returnParameters", toJson(*_node.returnParameterList())), - make_pair("modifiers", toJson(_node.modifiers())), - make_pair("body", _node.isImplemented() ? toJson(_node.body()) : Json::nullValue), - make_pair("implemented", _node.isImplemented()), - make_pair("scope", idOrNull(_node.scope())) + std::vector> attributes = { + std::make_pair("name", _node.name()), + std::make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), + std::make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), + std::make_pair("kind", _node.isFree() ? "freeFunction" : TokenTraits::toString(_node.kind())), + std::make_pair("stateMutability", stateMutabilityToString(_node.stateMutability())), + std::make_pair("virtual", _node.markedVirtual()), + std::make_pair("overrides", _node.overrides() ? toJson(*_node.overrides()) : Json::nullValue), + std::make_pair("parameters", toJson(_node.parameterList())), + std::make_pair("returnParameters", toJson(*_node.returnParameterList())), + std::make_pair("modifiers", toJson(_node.modifiers())), + std::make_pair("body", _node.isImplemented() ? toJson(_node.body()) : Json::nullValue), + std::make_pair("implemented", _node.isImplemented()), + std::make_pair("scope", idOrNull(_node.scope())) }; - optional visibility; + std::optional visibility; if (_node.isConstructor()) { if (_node.annotation().contract) @@ -482,7 +481,7 @@ bool ASTJsonExporter::visit(FunctionDefinition const& _node) if (_node.isPartOfExternalInterface() && m_stackState > CompilerStack::State::ParsedAndImported) attributes.emplace_back("functionSelector", _node.externalIdentifierHex()); if (!_node.annotation().baseFunctions.empty()) - attributes.emplace_back(make_pair("baseFunctions", getContainerIds(_node.annotation().baseFunctions, true))); + attributes.emplace_back(std::make_pair("baseFunctions", getContainerIds(_node.annotation().baseFunctions, true))); setJsonNode(_node, "FunctionDefinition", std::move(attributes)); return false; @@ -490,19 +489,19 @@ bool ASTJsonExporter::visit(FunctionDefinition const& _node) bool ASTJsonExporter::visit(VariableDeclaration const& _node) { - std::vector> attributes = { - make_pair("name", _node.name()), - make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), - make_pair("typeName", toJson(_node.typeName())), - make_pair("constant", _node.isConstant()), - make_pair("mutability", VariableDeclaration::mutabilityToString(_node.mutability())), - make_pair("stateVariable", _node.isStateVariable()), - make_pair("storageLocation", location(_node.referenceLocation())), - make_pair("overrides", _node.overrides() ? toJson(*_node.overrides()) : Json::nullValue), - make_pair("visibility", Declaration::visibilityToString(_node.visibility())), - make_pair("value", _node.value() ? toJson(*_node.value()) : Json::nullValue), - make_pair("scope", idOrNull(_node.scope())), - make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) + std::vector> attributes = { + std::make_pair("name", _node.name()), + std::make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), + std::make_pair("typeName", toJson(_node.typeName())), + std::make_pair("constant", _node.isConstant()), + std::make_pair("mutability", VariableDeclaration::mutabilityToString(_node.mutability())), + std::make_pair("stateVariable", _node.isStateVariable()), + std::make_pair("storageLocation", location(_node.referenceLocation())), + std::make_pair("overrides", _node.overrides() ? toJson(*_node.overrides()) : Json::nullValue), + std::make_pair("visibility", Declaration::visibilityToString(_node.visibility())), + std::make_pair("value", _node.value() ? toJson(*_node.value()) : Json::nullValue), + std::make_pair("scope", idOrNull(_node.scope())), + std::make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) }; if (_node.isStateVariable() && _node.isPublic()) attributes.emplace_back("functionSelector", _node.externalIdentifierHex()); @@ -511,34 +510,34 @@ bool ASTJsonExporter::visit(VariableDeclaration const& _node) if (m_inEvent) attributes.emplace_back("indexed", _node.isIndexed()); if (!_node.annotation().baseFunctions.empty()) - attributes.emplace_back(make_pair("baseFunctions", getContainerIds(_node.annotation().baseFunctions, true))); + attributes.emplace_back(std::make_pair("baseFunctions", getContainerIds(_node.annotation().baseFunctions, true))); setJsonNode(_node, "VariableDeclaration", std::move(attributes)); return false; } bool ASTJsonExporter::visit(ModifierDefinition const& _node) { - std::vector> attributes = { - make_pair("name", _node.name()), - make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), - make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), - make_pair("visibility", Declaration::visibilityToString(_node.visibility())), - make_pair("parameters", toJson(_node.parameterList())), - make_pair("virtual", _node.markedVirtual()), - make_pair("overrides", _node.overrides() ? toJson(*_node.overrides()) : Json::nullValue), - make_pair("body", _node.isImplemented() ? toJson(_node.body()) : Json::nullValue) + std::vector> attributes = { + std::make_pair("name", _node.name()), + std::make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), + std::make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), + std::make_pair("visibility", Declaration::visibilityToString(_node.visibility())), + std::make_pair("parameters", toJson(_node.parameterList())), + std::make_pair("virtual", _node.markedVirtual()), + std::make_pair("overrides", _node.overrides() ? toJson(*_node.overrides()) : Json::nullValue), + std::make_pair("body", _node.isImplemented() ? toJson(_node.body()) : Json::nullValue) }; if (!_node.annotation().baseFunctions.empty()) - attributes.emplace_back(make_pair("baseModifiers", getContainerIds(_node.annotation().baseFunctions, true))); + attributes.emplace_back(std::make_pair("baseModifiers", getContainerIds(_node.annotation().baseFunctions, true))); setJsonNode(_node, "ModifierDefinition", std::move(attributes)); return false; } bool ASTJsonExporter::visit(ModifierInvocation const& _node) { - std::vector> attributes{ - make_pair("modifierName", toJson(_node.name())), - make_pair("arguments", _node.arguments() ? toJson(*_node.arguments()) : Json::nullValue) + std::vector> attributes{ + std::make_pair("modifierName", toJson(_node.name())), + std::make_pair("arguments", _node.arguments() ? toJson(*_node.arguments()) : Json::nullValue) }; if (Declaration const* declaration = _node.name().annotation().referencedDeclaration) { @@ -554,16 +553,16 @@ bool ASTJsonExporter::visit(ModifierInvocation const& _node) bool ASTJsonExporter::visit(EventDefinition const& _node) { m_inEvent = true; - std::vector> _attributes = { - make_pair("name", _node.name()), - make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), - make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), - make_pair("parameters", toJson(_node.parameterList())), - make_pair("anonymous", _node.isAnonymous()) + std::vector> _attributes = { + std::make_pair("name", _node.name()), + std::make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), + std::make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), + std::make_pair("parameters", toJson(_node.parameterList())), + std::make_pair("anonymous", _node.isAnonymous()) }; if (m_stackState >= CompilerStack::State::AnalysisPerformed) _attributes.emplace_back( - make_pair( + std::make_pair( "eventSelector", toHex(u256(util::h256::Arith(util::keccak256(_node.functionType(true)->externalSignature())))) )); @@ -574,14 +573,14 @@ bool ASTJsonExporter::visit(EventDefinition const& _node) bool ASTJsonExporter::visit(ErrorDefinition const& _node) { - std::vector> _attributes = { - make_pair("name", _node.name()), - make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), - make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), - make_pair("parameters", toJson(_node.parameterList())) + std::vector> _attributes = { + std::make_pair("name", _node.name()), + std::make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), + std::make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue), + std::make_pair("parameters", toJson(_node.parameterList())) }; if (m_stackState >= CompilerStack::State::AnalysisPerformed) - _attributes.emplace_back(make_pair("errorSelector", _node.functionType(true)->externalIdentifierHex())); + _attributes.emplace_back(std::make_pair("errorSelector", _node.functionType(true)->externalIdentifierHex())); setJsonNode(_node, "ErrorDefinition", std::move(_attributes)); return false; @@ -589,13 +588,13 @@ bool ASTJsonExporter::visit(ErrorDefinition const& _node) bool ASTJsonExporter::visit(ElementaryTypeName const& _node) { - std::vector> attributes = { - make_pair("name", _node.typeName().toString()), - make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) + std::vector> attributes = { + std::make_pair("name", _node.typeName().toString()), + std::make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) }; if (_node.stateMutability()) - attributes.emplace_back(make_pair("stateMutability", stateMutabilityToString(*_node.stateMutability()))); + attributes.emplace_back(std::make_pair("stateMutability", stateMutabilityToString(*_node.stateMutability()))); setJsonNode(_node, "ElementaryTypeName", std::move(attributes)); return false; @@ -604,9 +603,9 @@ bool ASTJsonExporter::visit(ElementaryTypeName const& _node) bool ASTJsonExporter::visit(UserDefinedTypeName const& _node) { setJsonNode(_node, "UserDefinedTypeName", { - make_pair("pathNode", toJson(_node.pathNode())), - make_pair("referencedDeclaration", idOrNull(_node.pathNode().annotation().referencedDeclaration)), - make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) + std::make_pair("pathNode", toJson(_node.pathNode())), + std::make_pair("referencedDeclaration", idOrNull(_node.pathNode().annotation().referencedDeclaration)), + std::make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) }); return false; } @@ -614,11 +613,11 @@ bool ASTJsonExporter::visit(UserDefinedTypeName const& _node) bool ASTJsonExporter::visit(FunctionTypeName const& _node) { setJsonNode(_node, "FunctionTypeName", { - make_pair("visibility", Declaration::visibilityToString(_node.visibility())), - make_pair("stateMutability", stateMutabilityToString(_node.stateMutability())), - make_pair("parameterTypes", toJson(*_node.parameterTypeList())), - make_pair("returnParameterTypes", toJson(*_node.returnParameterTypeList())), - make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) + std::make_pair("visibility", Declaration::visibilityToString(_node.visibility())), + std::make_pair("stateMutability", stateMutabilityToString(_node.stateMutability())), + std::make_pair("parameterTypes", toJson(*_node.parameterTypeList())), + std::make_pair("returnParameterTypes", toJson(*_node.returnParameterTypeList())), + std::make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) }); return false; } @@ -626,13 +625,13 @@ bool ASTJsonExporter::visit(FunctionTypeName const& _node) bool ASTJsonExporter::visit(Mapping const& _node) { setJsonNode(_node, "Mapping", { - make_pair("keyType", toJson(_node.keyType())), - make_pair("keyName", _node.keyName()), - make_pair("keyNameLocation", sourceLocationToString(_node.keyNameLocation())), - make_pair("valueType", toJson(_node.valueType())), - make_pair("valueName", _node.valueName()), - make_pair("valueNameLocation", sourceLocationToString(_node.valueNameLocation())), - make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) + std::make_pair("keyType", toJson(_node.keyType())), + std::make_pair("keyName", _node.keyName()), + std::make_pair("keyNameLocation", sourceLocationToString(_node.keyNameLocation())), + std::make_pair("valueType", toJson(_node.valueType())), + std::make_pair("valueName", _node.valueName()), + std::make_pair("valueNameLocation", sourceLocationToString(_node.valueNameLocation())), + std::make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) }); return false; } @@ -640,20 +639,20 @@ bool ASTJsonExporter::visit(Mapping const& _node) bool ASTJsonExporter::visit(ArrayTypeName const& _node) { setJsonNode(_node, "ArrayTypeName", { - make_pair("baseType", toJson(_node.baseType())), - make_pair("length", toJsonOrNull(_node.length())), - make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) + std::make_pair("baseType", toJson(_node.baseType())), + std::make_pair("length", toJsonOrNull(_node.length())), + std::make_pair("typeDescriptions", typePointerToJson(_node.annotation().type, true)) }); return false; } bool ASTJsonExporter::visit(InlineAssembly const& _node) { - vector> externalReferences; + std::vector> externalReferences; for (auto const& it: _node.annotation().externalReferences) if (it.first) - externalReferences.emplace_back(make_pair( + externalReferences.emplace_back(std::make_pair( it.first->name.str(), inlineAssemblyIdentifierToJson(it) )); @@ -664,10 +663,10 @@ bool ASTJsonExporter::visit(InlineAssembly const& _node) for (Json::Value& it: externalReferences | ranges::views::values) externalReferencesJson.append(std::move(it)); - std::vector> attributes = { - make_pair("AST", Json::Value(yul::AsmJsonConverter(sourceIndexFromLocation(_node.location()))(_node.operations()))), - make_pair("externalReferences", std::move(externalReferencesJson)), - make_pair("evmVersion", dynamic_cast(_node.dialect()).evmVersion().name()) + std::vector> attributes = { + std::make_pair("AST", Json::Value(yul::AsmJsonConverter(sourceIndexFromLocation(_node.location()))(_node.operations()))), + std::make_pair("externalReferences", std::move(externalReferencesJson)), + std::make_pair("evmVersion", dynamic_cast(_node.dialect()).evmVersion().name()) }; if (_node.flags()) @@ -678,7 +677,7 @@ bool ASTJsonExporter::visit(InlineAssembly const& _node) flags.append(*flag); else flags.append(Json::nullValue); - attributes.emplace_back(make_pair("flags", std::move(flags))); + attributes.emplace_back(std::make_pair("flags", std::move(flags))); } setJsonNode(_node, "InlineAssembly", std::move(attributes)); @@ -688,7 +687,7 @@ bool ASTJsonExporter::visit(InlineAssembly const& _node) bool ASTJsonExporter::visit(Block const& _node) { setJsonNode(_node, _node.unchecked() ? "UncheckedBlock" : "Block", { - make_pair("statements", toJson(_node.statements())) + std::make_pair("statements", toJson(_node.statements())) }); return false; } @@ -702,9 +701,9 @@ bool ASTJsonExporter::visit(PlaceholderStatement const& _node) bool ASTJsonExporter::visit(IfStatement const& _node) { setJsonNode(_node, "IfStatement", { - make_pair("condition", toJson(_node.condition())), - make_pair("trueBody", toJson(_node.trueStatement())), - make_pair("falseBody", toJsonOrNull(_node.falseStatement())) + std::make_pair("condition", toJson(_node.condition())), + std::make_pair("trueBody", toJson(_node.trueStatement())), + std::make_pair("falseBody", toJsonOrNull(_node.falseStatement())) }); return false; } @@ -712,9 +711,9 @@ bool ASTJsonExporter::visit(IfStatement const& _node) bool ASTJsonExporter::visit(TryCatchClause const& _node) { setJsonNode(_node, "TryCatchClause", { - make_pair("errorName", _node.errorName()), - make_pair("parameters", toJsonOrNull(_node.parameters())), - make_pair("block", toJson(_node.block())) + std::make_pair("errorName", _node.errorName()), + std::make_pair("parameters", toJsonOrNull(_node.parameters())), + std::make_pair("block", toJson(_node.block())) }); return false; } @@ -722,8 +721,8 @@ bool ASTJsonExporter::visit(TryCatchClause const& _node) bool ASTJsonExporter::visit(TryStatement const& _node) { setJsonNode(_node, "TryStatement", { - make_pair("externalCall", toJson(_node.externalCall())), - make_pair("clauses", toJson(_node.clauses())) + std::make_pair("externalCall", toJson(_node.externalCall())), + std::make_pair("clauses", toJson(_node.clauses())) }); return false; } @@ -734,8 +733,8 @@ bool ASTJsonExporter::visit(WhileStatement const& _node) _node, _node.isDoWhile() ? "DoWhileStatement" : "WhileStatement", { - make_pair("condition", toJson(_node.condition())), - make_pair("body", toJson(_node.body())) + std::make_pair("condition", toJson(_node.condition())), + std::make_pair("body", toJson(_node.body())) } ); return false; @@ -744,10 +743,10 @@ bool ASTJsonExporter::visit(WhileStatement const& _node) bool ASTJsonExporter::visit(ForStatement const& _node) { setJsonNode(_node, "ForStatement", { - make_pair("initializationExpression", toJsonOrNull(_node.initializationExpression())), - make_pair("condition", toJsonOrNull(_node.condition())), - make_pair("loopExpression", toJsonOrNull(_node.loopExpression())), - make_pair("body", toJson(_node.body())) + std::make_pair("initializationExpression", toJsonOrNull(_node.initializationExpression())), + std::make_pair("condition", toJsonOrNull(_node.condition())), + std::make_pair("loopExpression", toJsonOrNull(_node.loopExpression())), + std::make_pair("body", toJson(_node.body())) }); return false; } @@ -767,8 +766,8 @@ bool ASTJsonExporter::visit(Break const& _node) bool ASTJsonExporter::visit(Return const& _node) { setJsonNode(_node, "Return", { - make_pair("expression", toJsonOrNull(_node.expression())), - make_pair("functionReturnParameters", idOrNull(_node.annotation().functionReturnParameters)) + std::make_pair("expression", toJsonOrNull(_node.expression())), + std::make_pair("functionReturnParameters", idOrNull(_node.annotation().functionReturnParameters)) }); return false; } @@ -782,7 +781,7 @@ bool ASTJsonExporter::visit(Throw const& _node) bool ASTJsonExporter::visit(EmitStatement const& _node) { setJsonNode(_node, "EmitStatement", { - make_pair("eventCall", toJson(_node.eventCall())) + std::make_pair("eventCall", toJson(_node.eventCall())) }); return false; } @@ -790,7 +789,7 @@ bool ASTJsonExporter::visit(EmitStatement const& _node) bool ASTJsonExporter::visit(RevertStatement const& _node) { setJsonNode(_node, "RevertStatement", { - make_pair("errorCall", toJson(_node.errorCall())) + std::make_pair("errorCall", toJson(_node.errorCall())) }); return false; } @@ -801,9 +800,9 @@ bool ASTJsonExporter::visit(VariableDeclarationStatement const& _node) for (auto const& v: _node.declarations()) appendMove(varDecs, idOrNull(v.get())); setJsonNode(_node, "VariableDeclarationStatement", { - make_pair("assignments", std::move(varDecs)), - make_pair("declarations", toJson(_node.declarations())), - make_pair("initialValue", toJsonOrNull(_node.initialValue())) + std::make_pair("assignments", std::move(varDecs)), + std::make_pair("declarations", toJson(_node.declarations())), + std::make_pair("initialValue", toJsonOrNull(_node.initialValue())) }); return false; } @@ -811,17 +810,17 @@ bool ASTJsonExporter::visit(VariableDeclarationStatement const& _node) bool ASTJsonExporter::visit(ExpressionStatement const& _node) { setJsonNode(_node, "ExpressionStatement", { - make_pair("expression", toJson(_node.expression())) + std::make_pair("expression", toJson(_node.expression())) }); return false; } bool ASTJsonExporter::visit(Conditional const& _node) { - std::vector> attributes = { - make_pair("condition", toJson(_node.condition())), - make_pair("trueExpression", toJson(_node.trueExpression())), - make_pair("falseExpression", toJson(_node.falseExpression())) + std::vector> attributes = { + std::make_pair("condition", toJson(_node.condition())), + std::make_pair("trueExpression", toJson(_node.trueExpression())), + std::make_pair("falseExpression", toJson(_node.falseExpression())) }; appendExpressionAttributes(attributes, _node.annotation()); setJsonNode(_node, "Conditional", std::move(attributes)); @@ -830,10 +829,10 @@ bool ASTJsonExporter::visit(Conditional const& _node) bool ASTJsonExporter::visit(Assignment const& _node) { - std::vector> attributes = { - make_pair("operator", TokenTraits::toString(_node.assignmentOperator())), - make_pair("leftHandSide", toJson(_node.leftHandSide())), - make_pair("rightHandSide", toJson(_node.rightHandSide())) + std::vector> attributes = { + std::make_pair("operator", TokenTraits::toString(_node.assignmentOperator())), + std::make_pair("leftHandSide", toJson(_node.leftHandSide())), + std::make_pair("rightHandSide", toJson(_node.rightHandSide())) }; appendExpressionAttributes(attributes, _node.annotation()); setJsonNode(_node, "Assignment", std::move(attributes)); @@ -842,9 +841,9 @@ bool ASTJsonExporter::visit(Assignment const& _node) bool ASTJsonExporter::visit(TupleExpression const& _node) { - std::vector> attributes = { - make_pair("isInlineArray", Json::Value(_node.isInlineArray())), - make_pair("components", toJson(_node.components())), + std::vector> attributes = { + std::make_pair("isInlineArray", Json::Value(_node.isInlineArray())), + std::make_pair("components", toJson(_node.components())), }; appendExpressionAttributes(attributes, _node.annotation()); setJsonNode(_node, "TupleExpression", std::move(attributes)); @@ -853,10 +852,10 @@ bool ASTJsonExporter::visit(TupleExpression const& _node) bool ASTJsonExporter::visit(UnaryOperation const& _node) { - std::vector> attributes = { - make_pair("prefix", _node.isPrefixOperation()), - make_pair("operator", TokenTraits::toString(_node.getOperator())), - make_pair("subExpression", toJson(_node.subExpression())) + std::vector> attributes = { + std::make_pair("prefix", _node.isPrefixOperation()), + std::make_pair("operator", TokenTraits::toString(_node.getOperator())), + std::make_pair("subExpression", toJson(_node.subExpression())) }; // NOTE: This annotation is guaranteed to be set but only if we didn't stop at the parsing stage. if (_node.annotation().userDefinedFunction.set() && *_node.annotation().userDefinedFunction != nullptr) @@ -868,11 +867,11 @@ bool ASTJsonExporter::visit(UnaryOperation const& _node) bool ASTJsonExporter::visit(BinaryOperation const& _node) { - std::vector> attributes = { - make_pair("operator", TokenTraits::toString(_node.getOperator())), - make_pair("leftExpression", toJson(_node.leftExpression())), - make_pair("rightExpression", toJson(_node.rightExpression())), - make_pair("commonType", typePointerToJson(_node.annotation().commonType)), + std::vector> attributes = { + std::make_pair("operator", TokenTraits::toString(_node.getOperator())), + std::make_pair("leftExpression", toJson(_node.leftExpression())), + std::make_pair("rightExpression", toJson(_node.rightExpression())), + std::make_pair("commonType", typePointerToJson(_node.annotation().commonType)), }; // NOTE: This annotation is guaranteed to be set but only if we didn't stop at the parsing stage. if (_node.annotation().userDefinedFunction.set() && *_node.annotation().userDefinedFunction != nullptr) @@ -887,12 +886,12 @@ bool ASTJsonExporter::visit(FunctionCall const& _node) Json::Value names(Json::arrayValue); for (auto const& name: _node.names()) names.append(Json::Value(*name)); - std::vector> attributes = { - make_pair("expression", toJson(_node.expression())), - make_pair("names", std::move(names)), - make_pair("nameLocations", sourceLocationsToJson(_node.nameLocations())), - make_pair("arguments", toJson(_node.arguments())), - make_pair("tryCall", _node.annotation().tryCall) + std::vector> attributes = { + std::make_pair("expression", toJson(_node.expression())), + std::make_pair("names", std::move(names)), + std::make_pair("nameLocations", sourceLocationsToJson(_node.nameLocations())), + std::make_pair("arguments", toJson(_node.arguments())), + std::make_pair("tryCall", _node.annotation().tryCall) }; if (_node.annotation().kind.set()) @@ -912,10 +911,10 @@ bool ASTJsonExporter::visit(FunctionCallOptions const& _node) for (auto const& name: _node.names()) names.append(Json::Value(*name)); - std::vector> attributes = { - make_pair("expression", toJson(_node.expression())), - make_pair("names", std::move(names)), - make_pair("options", toJson(_node.options())), + std::vector> attributes = { + std::make_pair("expression", toJson(_node.expression())), + std::make_pair("names", std::move(names)), + std::make_pair("options", toJson(_node.options())), }; appendExpressionAttributes(attributes, _node.annotation()); @@ -925,8 +924,8 @@ bool ASTJsonExporter::visit(FunctionCallOptions const& _node) bool ASTJsonExporter::visit(NewExpression const& _node) { - std::vector> attributes = { - make_pair("typeName", toJson(_node.typeName())) + std::vector> attributes = { + std::make_pair("typeName", toJson(_node.typeName())) }; appendExpressionAttributes(attributes, _node.annotation()); setJsonNode(_node, "NewExpression", std::move(attributes)); @@ -935,11 +934,11 @@ bool ASTJsonExporter::visit(NewExpression const& _node) bool ASTJsonExporter::visit(MemberAccess const& _node) { - std::vector> attributes = { - make_pair("memberName", _node.memberName()), - make_pair("memberLocation", Json::Value(sourceLocationToString(_node.memberLocation()))), - make_pair("expression", toJson(_node.expression())), - make_pair("referencedDeclaration", idOrNull(_node.annotation().referencedDeclaration)), + std::vector> attributes = { + std::make_pair("memberName", _node.memberName()), + std::make_pair("memberLocation", Json::Value(sourceLocationToString(_node.memberLocation()))), + std::make_pair("expression", toJson(_node.expression())), + std::make_pair("referencedDeclaration", idOrNull(_node.annotation().referencedDeclaration)), }; appendExpressionAttributes(attributes, _node.annotation()); setJsonNode(_node, "MemberAccess", std::move(attributes)); @@ -948,9 +947,9 @@ bool ASTJsonExporter::visit(MemberAccess const& _node) bool ASTJsonExporter::visit(IndexAccess const& _node) { - std::vector> attributes = { - make_pair("baseExpression", toJson(_node.baseExpression())), - make_pair("indexExpression", toJsonOrNull(_node.indexExpression())), + std::vector> attributes = { + std::make_pair("baseExpression", toJson(_node.baseExpression())), + std::make_pair("indexExpression", toJsonOrNull(_node.indexExpression())), }; appendExpressionAttributes(attributes, _node.annotation()); setJsonNode(_node, "IndexAccess", std::move(attributes)); @@ -959,10 +958,10 @@ bool ASTJsonExporter::visit(IndexAccess const& _node) bool ASTJsonExporter::visit(IndexRangeAccess const& _node) { - std::vector> attributes = { - make_pair("baseExpression", toJson(_node.baseExpression())), - make_pair("startExpression", toJsonOrNull(_node.startExpression())), - make_pair("endExpression", toJsonOrNull(_node.endExpression())), + std::vector> attributes = { + std::make_pair("baseExpression", toJson(_node.baseExpression())), + std::make_pair("startExpression", toJsonOrNull(_node.startExpression())), + std::make_pair("endExpression", toJsonOrNull(_node.endExpression())), }; appendExpressionAttributes(attributes, _node.annotation()); setJsonNode(_node, "IndexRangeAccess", std::move(attributes)); @@ -975,19 +974,19 @@ bool ASTJsonExporter::visit(Identifier const& _node) for (auto const& dec: _node.annotation().overloadedDeclarations) overloads.append(nodeId(*dec)); setJsonNode(_node, "Identifier", { - make_pair("name", _node.name()), - make_pair("referencedDeclaration", idOrNull(_node.annotation().referencedDeclaration)), - make_pair("overloadedDeclarations", overloads), - make_pair("typeDescriptions", typePointerToJson(_node.annotation().type)), - make_pair("argumentTypes", typePointerToJson(_node.annotation().arguments)) + std::make_pair("name", _node.name()), + std::make_pair("referencedDeclaration", idOrNull(_node.annotation().referencedDeclaration)), + std::make_pair("overloadedDeclarations", overloads), + std::make_pair("typeDescriptions", typePointerToJson(_node.annotation().type)), + std::make_pair("argumentTypes", typePointerToJson(_node.annotation().arguments)) }); return false; } bool ASTJsonExporter::visit(ElementaryTypeNameExpression const& _node) { - std::vector> attributes = { - make_pair("typeName", toJson(_node.type())) + std::vector> attributes = { + std::make_pair("typeName", toJson(_node.type())) }; appendExpressionAttributes(attributes, _node.annotation()); setJsonNode(_node, "ElementaryTypeNameExpression", std::move(attributes)); @@ -1000,11 +999,11 @@ bool ASTJsonExporter::visit(Literal const& _node) if (!util::validateUTF8(_node.value())) value = Json::nullValue; Token subdenomination = Token(_node.subDenomination()); - std::vector> attributes = { - make_pair("kind", literalTokenKind(_node.token())), - make_pair("value", value), - make_pair("hexValue", util::toHex(util::asBytes(_node.value()))), - make_pair( + std::vector> attributes = { + std::make_pair("kind", literalTokenKind(_node.token())), + std::make_pair("value", value), + std::make_pair("hexValue", util::toHex(util::asBytes(_node.value()))), + std::make_pair( "subdenomination", subdenomination == Token::Illegal ? Json::nullValue : @@ -1019,8 +1018,8 @@ bool ASTJsonExporter::visit(Literal const& _node) bool ASTJsonExporter::visit(StructuredDocumentation const& _node) { Json::Value text{*_node.text()}; - std::vector> attributes = { - make_pair("text", text) + std::vector> attributes = { + std::make_pair("text", text) }; setJsonNode(_node, "StructuredDocumentation", std::move(attributes)); return false; @@ -1033,7 +1032,7 @@ void ASTJsonExporter::endVisit(EventDefinition const&) m_inEvent = false; } -string ASTJsonExporter::location(VariableDeclaration::Location _location) +std::string ASTJsonExporter::location(VariableDeclaration::Location _location) { switch (_location) { @@ -1050,7 +1049,7 @@ string ASTJsonExporter::location(VariableDeclaration::Location _location) return {}; } -string ASTJsonExporter::contractKind(ContractKind _kind) +std::string ASTJsonExporter::contractKind(ContractKind _kind) { switch (_kind) { @@ -1066,7 +1065,7 @@ string ASTJsonExporter::contractKind(ContractKind _kind) return {}; } -string ASTJsonExporter::functionCallKind(FunctionCallKind _kind) +std::string ASTJsonExporter::functionCallKind(FunctionCallKind _kind) { switch (_kind) { @@ -1081,7 +1080,7 @@ string ASTJsonExporter::functionCallKind(FunctionCallKind _kind) } } -string ASTJsonExporter::literalTokenKind(Token _token) +std::string ASTJsonExporter::literalTokenKind(Token _token) { switch (_token) { @@ -1101,12 +1100,12 @@ string ASTJsonExporter::literalTokenKind(Token _token) } } -string ASTJsonExporter::type(Expression const& _expression) +std::string ASTJsonExporter::type(Expression const& _expression) { return _expression.annotation().type ? _expression.annotation().type->toString() : "Unknown"; } -string ASTJsonExporter::type(VariableDeclaration const& _varDecl) +std::string ASTJsonExporter::type(VariableDeclaration const& _varDecl) { return _varDecl.annotation().type ? _varDecl.annotation().type->toString() : "Unknown"; } diff --git a/libsolidity/ast/ASTJsonImporter.cpp b/libsolidity/ast/ASTJsonImporter.cpp index dd7098aabf9a..6e6dd9eb5eeb 100644 --- a/libsolidity/ast/ASTJsonImporter.cpp +++ b/libsolidity/ast/ASTJsonImporter.cpp @@ -37,8 +37,6 @@ #include #include -using namespace std; - namespace solidity::frontend { @@ -50,16 +48,16 @@ ASTPointer ASTJsonImporter::nullOrCast(Json::Value const& _json) if (_json.isNull()) return nullptr; else - return dynamic_pointer_cast(convertJsonToASTNode(_json)); + return std::dynamic_pointer_cast(convertJsonToASTNode(_json)); } // ============ public =========================== -map> ASTJsonImporter::jsonToSourceUnit(map const& _sourceList) +std::map> ASTJsonImporter::jsonToSourceUnit(std::map const& _sourceList) { for (auto const& src: _sourceList) - m_sourceNames.emplace_back(make_shared(src.first)); + m_sourceNames.emplace_back(std::make_shared(src.first)); for (auto const& srcPair: _sourceList) { astAssert(!srcPair.second.isNull()); @@ -81,7 +79,7 @@ ASTPointer ASTJsonImporter::createASTNode(Json::Value const& _node, Args&&... astAssert(m_usedIDs.insert(id).second, "Found duplicate node ID!"); - auto n = make_shared( + auto n = std::make_shared( id, createSourceLocation(_node), std::forward(_args)... @@ -96,9 +94,9 @@ SourceLocation const ASTJsonImporter::createSourceLocation(Json::Value const& _n return solidity::langutil::parseSourceLocation(_node["src"].asString(), m_sourceNames); } -optional> ASTJsonImporter::createSourceLocations(Json::Value const& _node) const +std::optional> ASTJsonImporter::createSourceLocations(Json::Value const& _node) const { - vector locations; + std::vector locations; if (_node.isMember("nameLocations") && _node["nameLocations"].isArray()) { @@ -107,7 +105,7 @@ optional> ASTJsonImporter::createSourceLocations(Json::Va return locations; } - return nullopt; + return std::nullopt; } SourceLocation ASTJsonImporter::createNameSourceLocation(Json::Value const& _node) @@ -134,7 +132,7 @@ SourceLocation ASTJsonImporter::createValueNameSourceLocation(Json::Value const& template ASTPointer ASTJsonImporter::convertJsonToASTNode(Json::Value const& _node) { - ASTPointer ret = dynamic_pointer_cast(convertJsonToASTNode(_node)); + ASTPointer ret = std::dynamic_pointer_cast(convertJsonToASTNode(_node)); astAssert(ret, "cast of converted json-node must not be nullptr"); return ret; } @@ -143,7 +141,7 @@ ASTPointer ASTJsonImporter::convertJsonToASTNode(Json::Value const& _node) ASTPointer ASTJsonImporter::convertJsonToASTNode(Json::Value const& _json) { astAssert(_json["nodeType"].isString() && _json.isMember("id"), "JSON-Node needs to have 'nodeType' and 'id' fields."); - string nodeType = _json["nodeType"].asString(); + std::string nodeType = _json["nodeType"].asString(); if (nodeType == "PragmaDirective") return createPragmaDirective(_json); if (nodeType == "ImportDirective") @@ -265,9 +263,9 @@ ASTPointer ASTJsonImporter::convertJsonToASTNode(Json::Value const& _js // ============ functions to instantiate the AST-Nodes from Json-Nodes ============== -ASTPointer ASTJsonImporter::createSourceUnit(Json::Value const& _node, string const& _srcName) +ASTPointer ASTJsonImporter::createSourceUnit(Json::Value const& _node, std::string const& _srcName) { - optional license; + std::optional license; if (_node.isMember("license") && !_node["license"].isNull()) license = _node["license"].asString(); @@ -275,7 +273,7 @@ ASTPointer ASTJsonImporter::createSourceUnit(Json::Value const& _nod if (_node.isMember("experimentalSolidity") && !_node["experimentalSolidity"].isNull()) experimentalSolidity = _node["experimentalSolidity"].asBool(); - vector> nodes; + std::vector> nodes; for (auto& child: member(_node, "nodes")) nodes.emplace_back(convertJsonToASTNode(child)); @@ -286,11 +284,11 @@ ASTPointer ASTJsonImporter::createSourceUnit(Json::Value const& _nod ASTPointer ASTJsonImporter::createPragmaDirective(Json::Value const& _node) { - vector tokens; - vector literals; + std::vector tokens; + std::vector literals; for (auto const& lit: member(_node, "literals")) { - string l = lit.asString(); + std::string l = lit.asString(); literals.push_back(l); tokens.push_back(scanSingleToken(l)); } @@ -309,7 +307,7 @@ ASTPointer ASTJsonImporter::createImportDirective(Json::Value c symbolAliases.push_back({ createIdentifier(tuple["foreign"]), - tuple["local"].isNull() ? nullptr : make_shared(tuple["local"].asString()), + tuple["local"].isNull() ? nullptr : std::make_shared(tuple["local"].asString()), createSourceLocation(tuple["foreign"])} ); } @@ -343,7 +341,7 @@ ASTPointer ASTJsonImporter::createContractDefinition(Json::V return createASTNode( _node, - make_shared(_node["name"].asString()), + std::make_shared(_node["name"].asString()), createNameSourceLocation(_node), _node["documentation"].isNull() ? nullptr : createDocumentation(member(_node, "documentation")), baseContracts, @@ -357,13 +355,13 @@ ASTPointer ASTJsonImporter::createIdentifierPath(Json::Value con { astAssert(_node["name"].isString(), "Expected 'name' to be a string!"); - vector namePath; - vector namePathLocations; - vector strs; - string nameString = member(_node, "name").asString(); + std::vector namePath; + std::vector namePathLocations; + std::vector strs; + std::string nameString = member(_node, "name").asString(); boost::algorithm::split(strs, nameString, boost::is_any_of(".")); astAssert(!strs.empty(), "Expected at least one element in IdentifierPath."); - for (string s: strs) + for (std::string s: strs) { astAssert(!s.empty(), "Expected non-empty string for IdentifierPath element."); namePath.emplace_back(s); @@ -395,20 +393,20 @@ ASTPointer ASTJsonImporter::createInheritanceSpecifier(Jso return createASTNode( _node, createIdentifierPath(member(_node, "baseName")), - member(_node, "arguments").isNull() ? nullptr : make_unique>>(arguments) + member(_node, "arguments").isNull() ? nullptr : std::make_unique>>(arguments) ); } ASTPointer ASTJsonImporter::createUsingForDirective(Json::Value const& _node) { - vector> functions; - vector> operators; + std::vector> functions; + std::vector> operators; if (_node.isMember("libraryName")) { astAssert(!_node["libraryName"].isArray()); astAssert(!_node["libraryName"]["operator"]); functions.emplace_back(createIdentifierPath(_node["libraryName"])); - operators.emplace_back(nullopt); + operators.emplace_back(std::nullopt); } else if (_node.isMember("functionList")) for (Json::Value const& function: _node["functionList"]) @@ -419,7 +417,7 @@ ASTPointer ASTJsonImporter::createUsingForDirective(Json::Val astAssert(!function.isMember("definition")); functions.emplace_back(createIdentifierPath(function["function"])); - operators.emplace_back(nullopt); + operators.emplace_back(std::nullopt); } else { @@ -520,7 +518,7 @@ ASTPointer ASTJsonImporter::createFunctionDefinition(Json::V Token kind; bool freeFunction = false; - string kindStr = member(_node, "kind").asString(); + std::string kindStr = member(_node, "kind").asString(); if (kindStr == "constructor") kind = Token::Constructor; @@ -572,7 +570,7 @@ ASTPointer ASTJsonImporter::createVariableDeclaration(Json: VariableDeclaration::Mutability mutability{}; astAssert(member(_node, "mutability").isString(), "'mutability' expected to be string."); - string const mutabilityStr = member(_node, "mutability").asString(); + std::string const mutabilityStr = member(_node, "mutability").asString(); if (mutabilityStr == "constant") { mutability = VariableDeclaration::Mutability::Constant; @@ -592,7 +590,7 @@ ASTPointer ASTJsonImporter::createVariableDeclaration(Json: return createASTNode( _node, nullOrCast(member(_node, "typeName")), - make_shared(member(_node, "name").asString()), + std::make_shared(member(_node, "name").asString()), createNameSourceLocation(_node), nullOrCast(member(_node, "value")), visibility(_node), @@ -626,7 +624,7 @@ ASTPointer ASTJsonImporter::createModifierInvocation(Json::V return createASTNode( _node, createIdentifierPath(member(_node, "modifierName")), - member(_node, "arguments").isNull() ? nullptr : make_unique>>(arguments) + member(_node, "arguments").isNull() ? nullptr : std::make_unique>>(arguments) ); } @@ -660,9 +658,9 @@ ASTPointer ASTJsonImporter::createElementaryTypeName(Json::V astAssert(_node["name"].isString(), "Expected 'name' to be a string!"); - string name = member(_node, "name").asString(); + std::string name = member(_node, "name").asString(); Token token; - tie(token, firstNum, secondNum) = TokenTraits::fromIdentifierOrKeyword(name); + std::tie(token, firstNum, secondNum) = TokenTraits::fromIdentifierOrKeyword(name); ElementaryTypeNameToken elem(token, firstNum, secondNum); std::optional mutability = {}; @@ -721,19 +719,19 @@ ASTPointer ASTJsonImporter::createInlineAssembly(Json::Value con astAssert(m_evmVersion == evmVersion, "Imported tree evm version differs from configured evm version!"); yul::Dialect const& dialect = yul::EVMDialect::strictAssemblyForEVM(evmVersion.value()); - ASTPointer>> flags; + ASTPointer>> flags; if (_node.isMember("flags")) { - flags = make_shared>>(); + flags = std::make_shared>>(); Json::Value const& flagsNode = _node["flags"]; astAssert(flagsNode.isArray(), "Assembly flags must be an array."); for (Json::ArrayIndex i = 0; i < flagsNode.size(); ++i) { astAssert(flagsNode[i].isString(), "Assembly flag must be a string."); - flags->emplace_back(make_shared(flagsNode[i].asString())); + flags->emplace_back(std::make_shared(flagsNode[i].asString())); } } - shared_ptr operations = make_shared(yul::AsmJsonImporter(m_sourceNames).createBlock(member(_node, "AST"))); + std::shared_ptr operations = std::make_shared(yul::AsmJsonImporter(m_sourceNames).createBlock(member(_node, "AST"))); return createASTNode( _node, nullOrASTString(_node, "documentation"), @@ -787,7 +785,7 @@ ASTPointer ASTJsonImporter::createTryCatchClause(Json::Value con ASTPointer ASTJsonImporter::createTryStatement(Json::Value const& _node) { - vector> clauses; + std::vector> clauses; for (auto& param: _node["clauses"]) clauses.emplace_back(createTryCatchClause(param)); @@ -957,10 +955,10 @@ ASTPointer ASTJsonImporter::createFunctionCall(Json::Value const& for (auto& name: member(_node, "names")) { astAssert(name.isString(), "Expected 'names' members to be strings!"); - names.push_back(make_shared(name.asString())); + names.push_back(std::make_shared(name.asString())); } - optional> sourceLocations = createSourceLocations(_node); + std::optional> sourceLocations = createSourceLocations(_node); return createASTNode( _node, @@ -969,7 +967,7 @@ ASTPointer ASTJsonImporter::createFunctionCall(Json::Value const& names, sourceLocations ? *sourceLocations : - vector(names.size()) + std::vector(names.size()) ); } @@ -982,7 +980,7 @@ ASTPointer ASTJsonImporter::createFunctionCallOptions(Json: for (auto& name: member(_node, "names")) { astAssert(name.isString(), "Expected 'names' members to be strings!"); - names.push_back(make_shared(name.asString())); + names.push_back(std::make_shared(name.asString())); } return createASTNode( @@ -1049,14 +1047,14 @@ ASTPointer ASTJsonImporter::createElementaryTypeNa ASTPointer ASTJsonImporter::createLiteral(Json::Value const& _node) { - static string const valStr = "value"; - static string const hexValStr = "hexValue"; + static std::string const valStr = "value"; + static std::string const hexValStr = "hexValue"; astAssert(member(_node, valStr).isString() || member(_node, hexValStr).isString(), "Literal-value is unset."); ASTPointer value = _node.isMember(hexValStr) ? - make_shared(util::asString(util::fromHex(_node[hexValStr].asString()))) : - make_shared(_node[valStr].asString()); + std::make_shared(util::asString(util::fromHex(_node[hexValStr].asString()))) : + std::make_shared(_node[valStr].asString()); return createASTNode( _node, @@ -1068,19 +1066,19 @@ ASTPointer ASTJsonImporter::createLiteral(Json::Value const& _node) ASTPointer ASTJsonImporter::createDocumentation(Json::Value const& _node) { - static string const textString = "text"; + static std::string const textString = "text"; astAssert(member(_node, textString).isString(), "'text' must be a string"); return createASTNode( _node, - make_shared(_node[textString].asString()) + std::make_shared(_node[textString].asString()) ); } // ===== helper functions ========== -Json::Value ASTJsonImporter::member(Json::Value const& _node, string const& _name) +Json::Value ASTJsonImporter::member(Json::Value const& _node, std::string const& _name) { if (!_node.isMember(_name)) return Json::nullValue; @@ -1095,19 +1093,19 @@ Token ASTJsonImporter::scanSingleToken(Json::Value const& _node) return scanner.currentToken(); } -ASTPointer ASTJsonImporter::nullOrASTString(Json::Value const& _json, string const& _name) +ASTPointer ASTJsonImporter::nullOrASTString(Json::Value const& _json, std::string const& _name) { return _json[_name].isString() ? memberAsASTString(_json, _name) : nullptr; } -ASTPointer ASTJsonImporter::memberAsASTString(Json::Value const& _node, string const& _name) +ASTPointer ASTJsonImporter::memberAsASTString(Json::Value const& _node, std::string const& _name) { Json::Value value = member(_node, _name); astAssert(value.isString(), "field " + _name + " must be of type string."); - return make_shared(_node[_name].asString()); + return std::make_shared(_node[_name].asString()); } -bool ASTJsonImporter::memberAsBool(Json::Value const& _node, string const& _name) +bool ASTJsonImporter::memberAsBool(Json::Value const& _node, std::string const& _name) { Json::Value value = member(_node, _name); astAssert(value.isBool(), "field " + _name + " must be of type boolean."); @@ -1156,7 +1154,7 @@ Visibility ASTJsonImporter::visibility(Json::Value const& _node) Json::Value visibility = member(_node, "visibility"); astAssert(visibility.isString(), "'visibility' expected to be a string."); - string const visibilityStr = visibility.asString(); + std::string const visibilityStr = visibility.asString(); if (visibilityStr == "default") return Visibility::Default; @@ -1180,7 +1178,7 @@ VariableDeclaration::Location ASTJsonImporter::location(Json::Value const& _node Json::Value storageLoc = member(_node, "storageLocation"); astAssert(storageLoc.isString(), "'storageLocation' expected to be a string."); - string const storageLocStr = storageLoc.asString(); + std::string const storageLocStr = storageLoc.asString(); if (storageLocStr == "default") return VariableDeclaration::Location::Unspecified; @@ -1206,7 +1204,7 @@ Literal::SubDenomination ASTJsonImporter::subdenomination(Json::Value const& _no astAssert(subDen.isString(), "'subDenomination' expected to be string."); - string const subDenStr = subDen.asString(); + std::string const subDenStr = subDen.asString(); if (subDenStr == "wei") return Literal::SubDenomination::Wei; @@ -1236,7 +1234,7 @@ Literal::SubDenomination ASTJsonImporter::subdenomination(Json::Value const& _no StateMutability ASTJsonImporter::stateMutability(Json::Value const& _node) { astAssert(member(_node, "stateMutability").isString(), "StateMutability' expected to be string."); - string const mutabilityStr = member(_node, "stateMutability").asString(); + std::string const mutabilityStr = member(_node, "stateMutability").asString(); if (mutabilityStr == "pure") return StateMutability::Pure; diff --git a/libsolidity/ast/CallGraph.cpp b/libsolidity/ast/CallGraph.cpp index bf37b2264d2f..04275c374034 100644 --- a/libsolidity/ast/CallGraph.cpp +++ b/libsolidity/ast/CallGraph.cpp @@ -18,7 +18,6 @@ #include -using namespace std; using namespace solidity::frontend; bool CallGraph::CompareByID::operator()(Node const& _lhs, Node const& _rhs) const @@ -26,21 +25,21 @@ bool CallGraph::CompareByID::operator()(Node const& _lhs, Node const& _rhs) cons if (_lhs.index() != _rhs.index()) return _lhs.index() < _rhs.index(); - if (holds_alternative(_lhs)) - return get(_lhs) < get(_rhs); - return get(_lhs)->id() < get(_rhs)->id(); + if (std::holds_alternative(_lhs)) + return std::get(_lhs) < std::get(_rhs); + return std::get(_lhs)->id() < std::get(_rhs)->id(); } bool CallGraph::CompareByID::operator()(Node const& _lhs, int64_t _rhs) const { - solAssert(!holds_alternative(_lhs), ""); + solAssert(!std::holds_alternative(_lhs), ""); - return get(_lhs)->id() < _rhs; + return std::get(_lhs)->id() < _rhs; } bool CallGraph::CompareByID::operator()(int64_t _lhs, Node const& _rhs) const { - solAssert(!holds_alternative(_rhs), ""); + solAssert(!std::holds_alternative(_rhs), ""); - return _lhs < get(_rhs)->id(); + return _lhs < std::get(_rhs)->id(); } diff --git a/libsolidity/ast/TypeProvider.cpp b/libsolidity/ast/TypeProvider.cpp index 6cf8b5c039e9..da508755687b 100644 --- a/libsolidity/ast/TypeProvider.cpp +++ b/libsolidity/ast/TypeProvider.cpp @@ -21,7 +21,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::frontend; using namespace solidity::util; @@ -31,126 +30,126 @@ InaccessibleDynamicType const TypeProvider::m_inaccessibleDynamic{}; /// The string and bytes unique_ptrs are initialized when they are first used because /// they rely on `byte` being available which we cannot guarantee in the static init context. -unique_ptr TypeProvider::m_bytesStorage; -unique_ptr TypeProvider::m_bytesMemory; -unique_ptr TypeProvider::m_bytesCalldata; -unique_ptr TypeProvider::m_stringStorage; -unique_ptr TypeProvider::m_stringMemory; +std::unique_ptr TypeProvider::m_bytesStorage; +std::unique_ptr TypeProvider::m_bytesMemory; +std::unique_ptr TypeProvider::m_bytesCalldata; +std::unique_ptr TypeProvider::m_stringStorage; +std::unique_ptr TypeProvider::m_stringMemory; TupleType const TypeProvider::m_emptyTuple{}; AddressType const TypeProvider::m_payableAddress{StateMutability::Payable}; AddressType const TypeProvider::m_address{StateMutability::NonPayable}; -array, 32> const TypeProvider::m_intM{{ - {make_unique(8 * 1, IntegerType::Modifier::Signed)}, - {make_unique(8 * 2, IntegerType::Modifier::Signed)}, - {make_unique(8 * 3, IntegerType::Modifier::Signed)}, - {make_unique(8 * 4, IntegerType::Modifier::Signed)}, - {make_unique(8 * 5, IntegerType::Modifier::Signed)}, - {make_unique(8 * 6, IntegerType::Modifier::Signed)}, - {make_unique(8 * 7, IntegerType::Modifier::Signed)}, - {make_unique(8 * 8, IntegerType::Modifier::Signed)}, - {make_unique(8 * 9, IntegerType::Modifier::Signed)}, - {make_unique(8 * 10, IntegerType::Modifier::Signed)}, - {make_unique(8 * 11, IntegerType::Modifier::Signed)}, - {make_unique(8 * 12, IntegerType::Modifier::Signed)}, - {make_unique(8 * 13, IntegerType::Modifier::Signed)}, - {make_unique(8 * 14, IntegerType::Modifier::Signed)}, - {make_unique(8 * 15, IntegerType::Modifier::Signed)}, - {make_unique(8 * 16, IntegerType::Modifier::Signed)}, - {make_unique(8 * 17, IntegerType::Modifier::Signed)}, - {make_unique(8 * 18, IntegerType::Modifier::Signed)}, - {make_unique(8 * 19, IntegerType::Modifier::Signed)}, - {make_unique(8 * 20, IntegerType::Modifier::Signed)}, - {make_unique(8 * 21, IntegerType::Modifier::Signed)}, - {make_unique(8 * 22, IntegerType::Modifier::Signed)}, - {make_unique(8 * 23, IntegerType::Modifier::Signed)}, - {make_unique(8 * 24, IntegerType::Modifier::Signed)}, - {make_unique(8 * 25, IntegerType::Modifier::Signed)}, - {make_unique(8 * 26, IntegerType::Modifier::Signed)}, - {make_unique(8 * 27, IntegerType::Modifier::Signed)}, - {make_unique(8 * 28, IntegerType::Modifier::Signed)}, - {make_unique(8 * 29, IntegerType::Modifier::Signed)}, - {make_unique(8 * 30, IntegerType::Modifier::Signed)}, - {make_unique(8 * 31, IntegerType::Modifier::Signed)}, - {make_unique(8 * 32, IntegerType::Modifier::Signed)} +std::array, 32> const TypeProvider::m_intM{{ + {std::make_unique(8 * 1, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 2, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 3, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 4, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 5, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 6, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 7, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 8, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 9, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 10, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 11, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 12, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 13, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 14, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 15, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 16, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 17, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 18, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 19, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 20, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 21, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 22, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 23, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 24, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 25, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 26, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 27, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 28, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 29, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 30, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 31, IntegerType::Modifier::Signed)}, + {std::make_unique(8 * 32, IntegerType::Modifier::Signed)} }}; -array, 32> const TypeProvider::m_uintM{{ - {make_unique(8 * 1, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 2, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 3, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 4, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 5, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 6, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 7, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 8, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 9, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 10, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 11, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 12, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 13, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 14, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 15, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 16, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 17, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 18, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 19, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 20, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 21, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 22, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 23, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 24, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 25, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 26, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 27, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 28, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 29, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 30, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 31, IntegerType::Modifier::Unsigned)}, - {make_unique(8 * 32, IntegerType::Modifier::Unsigned)} +std::array, 32> const TypeProvider::m_uintM{{ + {std::make_unique(8 * 1, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 2, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 3, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 4, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 5, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 6, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 7, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 8, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 9, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 10, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 11, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 12, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 13, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 14, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 15, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 16, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 17, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 18, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 19, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 20, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 21, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 22, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 23, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 24, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 25, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 26, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 27, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 28, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 29, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 30, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 31, IntegerType::Modifier::Unsigned)}, + {std::make_unique(8 * 32, IntegerType::Modifier::Unsigned)} }}; -array, 32> const TypeProvider::m_bytesM{{ - {make_unique(1)}, - {make_unique(2)}, - {make_unique(3)}, - {make_unique(4)}, - {make_unique(5)}, - {make_unique(6)}, - {make_unique(7)}, - {make_unique(8)}, - {make_unique(9)}, - {make_unique(10)}, - {make_unique(11)}, - {make_unique(12)}, - {make_unique(13)}, - {make_unique(14)}, - {make_unique(15)}, - {make_unique(16)}, - {make_unique(17)}, - {make_unique(18)}, - {make_unique(19)}, - {make_unique(20)}, - {make_unique(21)}, - {make_unique(22)}, - {make_unique(23)}, - {make_unique(24)}, - {make_unique(25)}, - {make_unique(26)}, - {make_unique(27)}, - {make_unique(28)}, - {make_unique(29)}, - {make_unique(30)}, - {make_unique(31)}, - {make_unique(32)} +std::array, 32> const TypeProvider::m_bytesM{{ + {std::make_unique(1)}, + {std::make_unique(2)}, + {std::make_unique(3)}, + {std::make_unique(4)}, + {std::make_unique(5)}, + {std::make_unique(6)}, + {std::make_unique(7)}, + {std::make_unique(8)}, + {std::make_unique(9)}, + {std::make_unique(10)}, + {std::make_unique(11)}, + {std::make_unique(12)}, + {std::make_unique(13)}, + {std::make_unique(14)}, + {std::make_unique(15)}, + {std::make_unique(16)}, + {std::make_unique(17)}, + {std::make_unique(18)}, + {std::make_unique(19)}, + {std::make_unique(20)}, + {std::make_unique(21)}, + {std::make_unique(22)}, + {std::make_unique(23)}, + {std::make_unique(24)}, + {std::make_unique(25)}, + {std::make_unique(26)}, + {std::make_unique(27)}, + {std::make_unique(28)}, + {std::make_unique(29)}, + {std::make_unique(30)}, + {std::make_unique(31)}, + {std::make_unique(32)} }}; -array, 4> const TypeProvider::m_magics{{ - {make_unique(MagicType::Kind::Block)}, - {make_unique(MagicType::Kind::Message)}, - {make_unique(MagicType::Kind::Transaction)}, - {make_unique(MagicType::Kind::ABI)} +std::array, 4> const TypeProvider::m_magics{{ + {std::make_unique(MagicType::Kind::Block)}, + {std::make_unique(MagicType::Kind::Message)}, + {std::make_unique(MagicType::Kind::Transaction)}, + {std::make_unique(MagicType::Kind::ABI)} // MetaType is stored separately }}; @@ -160,7 +159,7 @@ inline void clearCache(Type const& type) } template -inline void clearCache(unique_ptr const& type) +inline void clearCache(std::unique_ptr const& type) { // Some lazy-initialized types might not exist yet. if (type) @@ -200,7 +199,7 @@ void TypeProvider::reset() template inline T const* TypeProvider::createAndGet(Args&& ... _args) { - instance().m_generalTypes.emplace_back(make_unique(std::forward(_args)...)); + instance().m_generalTypes.emplace_back(std::make_unique(std::forward(_args)...)); return static_cast(instance().m_generalTypes.back().get()); } @@ -259,15 +258,15 @@ Type const* TypeProvider::fromElementaryTypeName(ElementaryTypeNameToken const& } } -Type const* TypeProvider::fromElementaryTypeName(string const& _name) +Type const* TypeProvider::fromElementaryTypeName(std::string const& _name) { - vector nameParts; + std::vector nameParts; boost::split(nameParts, _name, boost::is_any_of(" ")); solAssert(nameParts.size() == 1 || nameParts.size() == 2, "Cannot parse elementary type: " + _name); Token token; unsigned short firstNum, secondNum; - tie(token, firstNum, secondNum) = TokenTraits::fromIdentifierOrKeyword(nameParts[0]); + std::tie(token, firstNum, secondNum) = TokenTraits::fromIdentifierOrKeyword(nameParts[0]); auto t = fromElementaryTypeName(ElementaryTypeNameToken(token, firstNum, secondNum)); if (auto* ref = dynamic_cast(t)) @@ -307,35 +306,35 @@ Type const* TypeProvider::fromElementaryTypeName(string const& _name) ArrayType const* TypeProvider::bytesStorage() { if (!m_bytesStorage) - m_bytesStorage = make_unique(DataLocation::Storage, false); + m_bytesStorage = std::make_unique(DataLocation::Storage, false); return m_bytesStorage.get(); } ArrayType const* TypeProvider::bytesMemory() { if (!m_bytesMemory) - m_bytesMemory = make_unique(DataLocation::Memory, false); + m_bytesMemory = std::make_unique(DataLocation::Memory, false); return m_bytesMemory.get(); } ArrayType const* TypeProvider::bytesCalldata() { if (!m_bytesCalldata) - m_bytesCalldata = make_unique(DataLocation::CallData, false); + m_bytesCalldata = std::make_unique(DataLocation::CallData, false); return m_bytesCalldata.get(); } ArrayType const* TypeProvider::stringStorage() { if (!m_stringStorage) - m_stringStorage = make_unique(DataLocation::Storage, true); + m_stringStorage = std::make_unique(DataLocation::Storage, true); return m_stringStorage.get(); } ArrayType const* TypeProvider::stringMemory() { if (!m_stringMemory) - m_stringMemory = make_unique(DataLocation::Memory, true); + m_stringMemory = std::make_unique(DataLocation::Memory, true); return m_stringMemory.get(); } @@ -376,30 +375,30 @@ RationalNumberType const* TypeProvider::rationalNumber(Literal const& _literal) return nullptr; } -StringLiteralType const* TypeProvider::stringLiteral(string const& literal) +StringLiteralType const* TypeProvider::stringLiteral(std::string const& literal) { auto i = instance().m_stringLiteralTypes.find(literal); if (i != instance().m_stringLiteralTypes.end()) return i->second.get(); else - return instance().m_stringLiteralTypes.emplace(literal, make_unique(literal)).first->second.get(); + return instance().m_stringLiteralTypes.emplace(literal, std::make_unique(literal)).first->second.get(); } FixedPointType const* TypeProvider::fixedPoint(unsigned m, unsigned n, FixedPointType::Modifier _modifier) { auto& map = _modifier == FixedPointType::Modifier::Unsigned ? instance().m_ufixedMxN : instance().m_fixedMxN; - auto i = map.find(make_pair(m, n)); + auto i = map.find(std::make_pair(m, n)); if (i != map.end()) return i->second.get(); return map.emplace( - make_pair(m, n), - make_unique(m, n, _modifier) + std::make_pair(m, n), + std::make_unique(m, n, _modifier) ).first->second.get(); } -TupleType const* TypeProvider::tuple(vector members) +TupleType const* TypeProvider::tuple(std::vector members) { if (members.empty()) return &m_emptyTuple; diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 2b955369fc9c..7b3e42143804 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -54,7 +54,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; @@ -111,7 +110,7 @@ util::Result transformParametersToExternal(TypePointers const& _pa return transformed; } -string toStringInParentheses(TypePointers const& _types, bool _withoutDataLocation) +std::string toStringInParentheses(TypePointers const& _types, bool _withoutDataLocation) { return '(' + util::joinHumanReadable( _types | ranges::views::transform([&](auto const* _type) { return _type->toString(_withoutDataLocation); }), @@ -125,7 +124,7 @@ MemberList::Member::Member(Declaration const* _declaration, Type const* _type): Member(_declaration, _type, _declaration->name()) {} -MemberList::Member::Member(Declaration const* _declaration, Type const* _type, string _name): +MemberList::Member::Member(Declaration const* _declaration, Type const* _type, std::string _name): name(std::move(_name)), type(_type), declaration(_declaration) @@ -143,7 +142,7 @@ void StorageOffsets::computeOffsets(TypePointers const& _types) { bigint slotOffset = 0; unsigned byteOffset = 0; - map> offsets; + std::map> offsets; for (size_t i = 0; i < _types.size(); ++i) { Type const* type = _types[i]; @@ -156,7 +155,7 @@ void StorageOffsets::computeOffsets(TypePointers const& _types) byteOffset = 0; } solAssert(slotOffset < bigint(1) << 256 ,"Object too large for storage."); - offsets[i] = make_pair(u256(slotOffset), byteOffset); + offsets[i] = std::make_pair(u256(slotOffset), byteOffset); solAssert(type->storageSize() >= 1, "Invalid storage size."); if (type->storageSize() == 1 && byteOffset + type->storageBytes() <= 32) byteOffset += type->storageBytes(); @@ -173,7 +172,7 @@ void StorageOffsets::computeOffsets(TypePointers const& _types) swap(m_offsets, offsets); } -pair const* StorageOffsets::offset(size_t _index) const +std::pair const* StorageOffsets::offset(size_t _index) const { if (m_offsets.count(_index)) return &m_offsets.at(_index); @@ -186,7 +185,7 @@ void MemberList::combine(MemberList const & _other) m_memberTypes += _other.m_memberTypes; } -pair const* MemberList::memberStorageOffset(string const& _name) const +std::pair const* MemberList::memberStorageOffset(std::string const& _name) const { StorageOffsets const& offsets = storageOffsets(); @@ -219,33 +218,33 @@ StorageOffsets const& MemberList::storageOffsets() const { namespace { -string parenthesizeIdentifier(string const& _internal) +std::string parenthesizeIdentifier(std::string const& _internal) { return "(" + _internal + ")"; } template -string identifierList(Range const&& _list) +std::string identifierList(Range const&& _list) { return parenthesizeIdentifier(boost::algorithm::join(_list, ",")); } -string richIdentifier(Type const* _type) +std::string richIdentifier(Type const* _type) { return _type ? _type->richIdentifier() : ""; } -string identifierList(vector const& _list) +std::string identifierList(std::vector const& _list) { return identifierList(_list | ranges::views::transform(richIdentifier)); } -string identifierList(Type const* _type) +std::string identifierList(Type const* _type) { return parenthesizeIdentifier(richIdentifier(_type)); } -string identifierList(Type const* _type1, Type const* _type2) +std::string identifierList(Type const* _type1, Type const* _type2) { TypePointers list; list.push_back(_type1); @@ -253,16 +252,16 @@ string identifierList(Type const* _type1, Type const* _type2) return identifierList(list); } -string parenthesizeUserIdentifier(string const& _internal) +std::string parenthesizeUserIdentifier(std::string const& _internal) { return parenthesizeIdentifier(_internal); } } -string Type::escapeIdentifier(string const& _identifier) +std::string Type::escapeIdentifier(std::string const& _identifier) { - string ret = _identifier; + std::string ret = _identifier; // FIXME: should be _$$$_ boost::algorithm::replace_all(ret, "$", "$$$"); boost::algorithm::replace_all(ret, ",", "_$_"); @@ -271,12 +270,12 @@ string Type::escapeIdentifier(string const& _identifier) return ret; } -string Type::identifier() const +std::string Type::identifier() const { - string ret = escapeIdentifier(richIdentifier()); + std::string ret = escapeIdentifier(richIdentifier()); solAssert(ret.find_first_of("0123456789") != 0, "Identifier cannot start with a number."); solAssert( - ret.find_first_not_of("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMONPQRSTUVWXYZ_$") == string::npos, + ret.find_first_not_of("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMONPQRSTUVWXYZ_$") == std::string::npos, "Identifier contains invalid characters." ); return ret; @@ -306,7 +305,7 @@ MemberList const& Type::members(ASTNode const* _currentScope) const MemberList::MemberMap members = nativeMembers(_currentScope); if (_currentScope) members += attachedFunctions(*this, *_currentScope); - m_members[_currentScope] = make_unique(std::move(members)); + m_members[_currentScope] = std::make_unique(std::move(members)); } return *m_members[_currentScope]; } @@ -341,9 +340,9 @@ Type const* Type::fullEncodingType(bool _inLibraryCall, bool _encoderV2, bool) c namespace { -vector usingForDirectivesForType(Type const& _type, ASTNode const& _scope) +std::vector usingForDirectivesForType(Type const& _type, ASTNode const& _scope) { - vector usingForDirectives; + std::vector usingForDirectives; SourceUnit const* sourceUnit = dynamic_cast(&_scope); if (auto const* contract = dynamic_cast(&_scope)) { @@ -378,12 +377,12 @@ vector usingForDirectivesForType(Type const& _type, AS _directive->typeName()->annotation().type, true ); - }) | ranges::to>; + }) | ranges::to>; } } -set Type::operatorDefinitions( +std::set Type::operatorDefinitions( Token _token, ASTNode const& _scope, bool _unary @@ -392,7 +391,7 @@ set Type::operatorDefinitions( if (!typeDefinition()) return {}; - set matchingDefinitions; + std::set matchingDefinitions; for (UsingForDirective const* directive: usingForDirectivesForType(*this, _scope)) for (auto const& [identifierPath, operator_]: directive->functionsAndOperators()) { @@ -419,8 +418,8 @@ MemberList::MemberMap Type::attachedFunctions(Type const& _type, ASTNode const& { MemberList::MemberMap members; - set> seenFunctions; - auto addFunction = [&](FunctionDefinition const& _function, optional _name = {}) + std::set> seenFunctions; + auto addFunction = [&](FunctionDefinition const& _function, std::optional _name = {}) { if (!_name) _name = _function.name(); @@ -432,7 +431,7 @@ MemberList::MemberMap Type::attachedFunctions(Type const& _type, ASTNode const& solAssert(withBoundFirstArgument, ""); if (_type.isImplicitlyConvertibleTo(*withBoundFirstArgument->selfType())) - if (seenFunctions.insert(make_pair(*_name, &_function)).second) + if (seenFunctions.insert(std::make_pair(*_name, &_function)).second) members.emplace_back(&_function, withBoundFirstArgument, *_name); }; @@ -474,7 +473,7 @@ AddressType::AddressType(StateMutability _stateMutability): solAssert(m_stateMutability == StateMutability::Payable || m_stateMutability == StateMutability::NonPayable, ""); } -string AddressType::richIdentifier() const +std::string AddressType::richIdentifier() const { if (m_stateMutability == StateMutability::Payable) return "t_address_payable"; @@ -508,7 +507,7 @@ BoolResult AddressType::isExplicitlyConvertibleTo(Type const& _convertTo) const return false; } -string AddressType::toString(bool) const +std::string AddressType::toString(bool) const { if (m_stateMutability == StateMutability::Payable) return "address payable"; @@ -516,7 +515,7 @@ string AddressType::toString(bool) const return "address"; } -string AddressType::canonicalName() const +std::string AddressType::canonicalName() const { return "address"; } @@ -596,9 +595,9 @@ IntegerType::IntegerType(unsigned _bits, IntegerType::Modifier _modifier): ); } -string IntegerType::richIdentifier() const +std::string IntegerType::richIdentifier() const { - return "t_" + string(isSigned() ? "" : "u") + "int" + to_string(numBits()); + return "t_" + std::string(isSigned() ? "" : "u") + "int" + std::to_string(numBits()); } BoolResult IntegerType::isImplicitlyConvertibleTo(Type const& _convertTo) const @@ -666,9 +665,9 @@ bool IntegerType::operator==(Type const& _other) const return other.m_bits == m_bits && other.m_modifier == m_modifier; } -string IntegerType::toString(bool) const +std::string IntegerType::toString(bool) const { - string prefix = isSigned() ? "int" : "uint"; + std::string prefix = isSigned() ? "int" : "uint"; return prefix + util::toString(m_bits); } @@ -763,9 +762,9 @@ FixedPointType::FixedPointType(unsigned _totalBits, unsigned _fractionalDigits, ); } -string FixedPointType::richIdentifier() const +std::string FixedPointType::richIdentifier() const { - return "t_" + string(isSigned() ? "" : "u") + "fixed" + to_string(m_totalBits) + "x" + to_string(m_fractionalDigits); + return "t_" + std::string(isSigned() ? "" : "u") + "fixed" + std::to_string(m_totalBits) + "x" + std::to_string(m_fractionalDigits); } BoolResult FixedPointType::isImplicitlyConvertibleTo(Type const& _convertTo) const @@ -815,9 +814,9 @@ bool FixedPointType::operator==(Type const& _other) const return other.m_totalBits == m_totalBits && other.m_fractionalDigits == m_fractionalDigits && other.m_modifier == m_modifier; } -string FixedPointType::toString(bool) const +std::string FixedPointType::toString(bool) const { - string prefix = isSigned() ? "fixed" : "ufixed"; + std::string prefix = isSigned() ? "fixed" : "ufixed"; return prefix + util::toString(m_totalBits) + "x" + util::toString(m_fractionalDigits); } @@ -858,7 +857,7 @@ IntegerType const* FixedPointType::asIntegerType() const return TypeProvider::integer(numBits(), isSigned() ? IntegerType::Modifier::Signed : IntegerType::Modifier::Unsigned); } -tuple RationalNumberType::parseRational(string const& _value) +std::tuple RationalNumberType::parseRational(std::string const& _value) { rational value; try @@ -871,7 +870,7 @@ tuple RationalNumberType::parseRational(string const& _value) !all_of(radixPoint + 1, _value.end(), util::isDigit) || !all_of(_value.begin(), radixPoint, util::isDigit) ) - return make_tuple(false, rational(0)); + return std::make_tuple(false, rational(0)); // Only decimal notation allowed here, leading zeros would switch to octal. auto fractionalBegin = find_if_not( @@ -883,25 +882,25 @@ tuple RationalNumberType::parseRational(string const& _value) rational numerator; rational denominator(1); - denominator = bigint(string(fractionalBegin, _value.end())); + denominator = bigint(std::string(fractionalBegin, _value.end())); denominator /= boost::multiprecision::pow( bigint(10), static_cast(distance(radixPoint + 1, _value.end())) ); - numerator = bigint(string(_value.begin(), radixPoint)); + numerator = bigint(std::string(_value.begin(), radixPoint)); value = numerator + denominator; } else value = bigint(_value); - return make_tuple(true, value); + return std::make_tuple(true, value); } catch (...) { - return make_tuple(false, rational(0)); + return std::make_tuple(false, rational(0)); } } -tuple RationalNumberType::isValidLiteral(Literal const& _literal) +std::tuple RationalNumberType::isValidLiteral(Literal const& _literal) { rational value; try @@ -920,27 +919,27 @@ tuple RationalNumberType::isValidLiteral(Literal const& _literal else if (expPoint != valueString.end()) { // Parse mantissa and exponent. Checks numeric limit. - tuple mantissa = parseRational(string(valueString.begin(), expPoint)); + std::tuple mantissa = parseRational(std::string(valueString.begin(), expPoint)); - if (!get<0>(mantissa)) - return make_tuple(false, rational(0)); - value = get<1>(mantissa); + if (!std::get<0>(mantissa)) + return std::make_tuple(false, rational(0)); + value = std::get<1>(mantissa); // 0E... is always zero. if (value == 0) - return make_tuple(true, rational(0)); + return std::make_tuple(true, rational(0)); - bigint exp = bigint(string(expPoint + 1, valueString.end())); + bigint exp = bigint(std::string(expPoint + 1, valueString.end())); - if (exp > numeric_limits::max() || exp < numeric_limits::min()) - return make_tuple(false, rational(0)); + if (exp > std::numeric_limits::max() || exp < std::numeric_limits::min()) + return std::make_tuple(false, rational(0)); uint32_t expAbs = bigint(abs(exp)).convert_to(); if (exp < 0) { if (!fitsPrecisionBase10(abs(value.denominator()), expAbs)) - return make_tuple(false, rational(0)); + return std::make_tuple(false, rational(0)); value /= boost::multiprecision::pow( bigint(10), expAbs @@ -949,7 +948,7 @@ tuple RationalNumberType::isValidLiteral(Literal const& _literal else if (exp > 0) { if (!fitsPrecisionBase10(abs(value.numerator()), expAbs)) - return make_tuple(false, rational(0)); + return std::make_tuple(false, rational(0)); value *= boost::multiprecision::pow( bigint(10), expAbs @@ -959,15 +958,15 @@ tuple RationalNumberType::isValidLiteral(Literal const& _literal else { // parse as rational number - tuple tmp = parseRational(valueString); - if (!get<0>(tmp)) + std::tuple tmp = parseRational(valueString); + if (!std::get<0>(tmp)) return tmp; - value = get<1>(tmp); + value = std::get<1>(tmp); } } catch (...) { - return make_tuple(false, rational(0)); + return std::make_tuple(false, rational(0)); } switch (_literal.subDenomination()) { @@ -999,7 +998,7 @@ tuple RationalNumberType::isValidLiteral(Literal const& _literal } - return make_tuple(true, value); + return std::make_tuple(true, value); } BoolResult RationalNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const @@ -1062,7 +1061,7 @@ BoolResult RationalNumberType::isExplicitlyConvertibleTo(Type const& _convertTo) TypeResult RationalNumberType::unaryOperatorResult(Token _operator) const { - if (optional value = ConstantEvaluator::evaluateUnaryOperator(_operator, m_value)) + if (std::optional value = ConstantEvaluator::evaluateUnaryOperator(_operator, m_value)) return TypeResult{TypeProvider::rationalNumber(*value)}; else return nullptr; @@ -1120,10 +1119,10 @@ TypeResult RationalNumberType::binaryOperatorResult(Token _operator, Type const* return nullptr; return thisMobile->binaryOperatorResult(_operator, otherMobile); } - else if (optional value = ConstantEvaluator::evaluateBinaryOperator(_operator, m_value, other.m_value)) + else if (std::optional value = ConstantEvaluator::evaluateBinaryOperator(_operator, m_value, other.m_value)) { // verify that numerator and denominator fit into 4096 bit after every operation - if (value->numerator() != 0 && max(boost::multiprecision::msb(abs(value->numerator())), boost::multiprecision::msb(abs(value->denominator()))) > 4096) + if (value->numerator() != 0 && std::max(boost::multiprecision::msb(abs(value->numerator())), boost::multiprecision::msb(abs(value->denominator()))) > 4096) return TypeResult::err("Precision of rational constants is limited to 4096 bits."); return TypeResult{TypeProvider::rationalNumber(*value)}; @@ -1132,7 +1131,7 @@ TypeResult RationalNumberType::binaryOperatorResult(Token _operator, Type const* return nullptr; } -string RationalNumberType::richIdentifier() const +std::string RationalNumberType::richIdentifier() const { // rational seemingly will put the sign always on the numerator, // but let just make it deterministic here. @@ -1152,24 +1151,24 @@ bool RationalNumberType::operator==(Type const& _other) const return m_value == other.m_value; } -string RationalNumberType::bigintToReadableString(bigint const& _num) +std::string RationalNumberType::bigintToReadableString(bigint const& _num) { - string str = _num.str(); + std::string str = _num.str(); if (str.size() > 32) { size_t omitted = str.size() - 8; - str = str.substr(0, 4) + "...(" + to_string(omitted) + " digits omitted)..." + str.substr(str.size() - 4, 4); + str = str.substr(0, 4) + "...(" + std::to_string(omitted) + " digits omitted)..." + str.substr(str.size() - 4, 4); } return str; } -string RationalNumberType::toString(bool) const +std::string RationalNumberType::toString(bool) const { if (!isFractional()) return "int_const " + bigintToReadableString(m_value.numerator()); - string numerator = bigintToReadableString(m_value.numerator()); - string denominator = bigintToReadableString(m_value.denominator()); + std::string numerator = bigintToReadableString(m_value.numerator()); + std::string denominator = bigintToReadableString(m_value.denominator()); return "rational_const " + numerator + " / " + denominator; } @@ -1221,7 +1220,7 @@ IntegerType const* RationalNumberType::integerType() const return nullptr; else return TypeProvider::integer( - max(numberEncodingSize(value), 1u) * 8, + std::max(numberEncodingSize(value), 1u) * 8, negative ? IntegerType::Modifier::Signed : IntegerType::Modifier::Unsigned ); } @@ -1255,7 +1254,7 @@ FixedPointType const* RationalNumberType::fixedPointType() const if (v > u256(-1)) return nullptr; - unsigned totalBits = max(numberEncodingSize(v), 1u) * 8; + unsigned totalBits = std::max(numberEncodingSize(v), 1u) * 8; solAssert(totalBits <= 256, ""); return TypeProvider::fixedPoint( @@ -1269,7 +1268,7 @@ StringLiteralType::StringLiteralType(Literal const& _literal): { } -StringLiteralType::StringLiteralType(string _value): +StringLiteralType::StringLiteralType(std::string _value): m_value{std::move(_value)} { } @@ -1300,9 +1299,9 @@ BoolResult StringLiteralType::isImplicitlyConvertibleTo(Type const& _convertTo) return false; } -string StringLiteralType::richIdentifier() const +std::string StringLiteralType::richIdentifier() const { - // Since we have to return a valid identifier and the string itself may contain + // Since we have to return a valid identifier and the std::string itself may contain // anything, we hash it. return "t_stringliteral_" + util::toHex(util::keccak256(m_value).asBytes()); } @@ -1316,7 +1315,7 @@ bool StringLiteralType::operator==(Type const& _other) const std::string StringLiteralType::toString(bool) const { - auto isPrintableASCII = [](string const& s) + auto isPrintableASCII = [](std::string const& s) { for (auto c: s) { @@ -1405,9 +1404,9 @@ MemberList::MemberMap FixedBytesType::nativeMembers(ASTNode const*) const return MemberList::MemberMap{MemberList::Member{"length", TypeProvider::uint(8)}}; } -string FixedBytesType::richIdentifier() const +std::string FixedBytesType::richIdentifier() const { - return "t_bytes" + to_string(m_bytes); + return "t_bytes" + std::to_string(m_bytes); } bool FixedBytesType::operator==(Type const& _other) const @@ -1511,10 +1510,10 @@ TypeResult ContractType::unaryOperatorResult(Token _operator) const return nullptr; } -vector CompositeType::fullDecomposition() const +std::vector CompositeType::fullDecomposition() const { - vector res = {this}; - unordered_set seen = {richIdentifier()}; + std::vector res = {this}; + std::unordered_set seen = {richIdentifier()}; for (size_t k = 0; k < res.size(); ++k) if (auto composite = dynamic_cast(res[k])) for (Type const* next: composite->decomposition()) @@ -1562,12 +1561,12 @@ Type const* ReferenceType::copyForLocationIfReference(Type const* _type) const return TypeProvider::withLocationIfReference(m_location, _type); } -string ReferenceType::stringForReferencePart() const +std::string ReferenceType::stringForReferencePart() const { switch (m_location) { case DataLocation::Storage: - return string("storage ") + (isPointer() ? "pointer" : "ref"); + return std::string("storage ") + (isPointer() ? "pointer" : "ref"); case DataLocation::CallData: return "calldata"; case DataLocation::Memory: @@ -1577,9 +1576,9 @@ string ReferenceType::stringForReferencePart() const return ""; } -string ReferenceType::identifierLocationSuffix() const +std::string ReferenceType::identifierLocationSuffix() const { - string id; + std::string id; switch (location()) { case DataLocation::Storage: @@ -1656,7 +1655,7 @@ BoolResult ArrayType::isExplicitlyConvertibleTo(Type const& _convertTo) const { if (isImplicitlyConvertibleTo(_convertTo)) return true; - // allow conversion bytes <-> string and bytes -> bytesNN + // allow conversion bytes <-> std::string and bytes -> bytesNN if (_convertTo.category() != category()) return isByteArray() && _convertTo.category() == Type::Category::FixedBytes; auto& convertTo = dynamic_cast(_convertTo); @@ -1667,9 +1666,9 @@ BoolResult ArrayType::isExplicitlyConvertibleTo(Type const& _convertTo) const return true; } -string ArrayType::richIdentifier() const +std::string ArrayType::richIdentifier() const { - string id; + std::string id; if (isString()) id = "t_string"; else if (isByteArrayOrString()) @@ -1735,13 +1734,13 @@ BoolResult ArrayType::validForLocation(DataLocation _loc) const size *= type->memoryHeadSize(); else size *= type->memoryDataSize(); - if (size >= numeric_limits::max()) + if (size >= std::numeric_limits::max()) return BoolResult::err("Type too large for memory."); break; } case DataLocation::CallData: { - if (unlimitedStaticCalldataSize(true) >= numeric_limits::max()) + if (unlimitedStaticCalldataSize(true) >= std::numeric_limits::max()) return BoolResult::err("Type too large for calldata."); break; } @@ -1766,7 +1765,7 @@ unsigned ArrayType::calldataEncodedSize(bool _padded) const { solAssert(!isDynamicallyEncoded(), ""); bigint size = unlimitedStaticCalldataSize(_padded); - solAssert(size <= numeric_limits::max(), "Array size does not fit unsigned."); + solAssert(size <= std::numeric_limits::max(), "Array size does not fit unsigned."); return unsigned(size); } @@ -1778,7 +1777,7 @@ unsigned ArrayType::calldataEncodedTailSize() const // length must still be present. return 32; bigint size = unlimitedStaticCalldataSize(false); - solAssert(size <= numeric_limits::max(), "Array size does not fit unsigned."); + solAssert(size <= std::numeric_limits::max(), "Array size does not fit unsigned."); return unsigned(size); } @@ -1812,10 +1811,10 @@ u256 ArrayType::storageSize() const else size = bigint(length()) * baseType()->storageSize(); solAssert(size < bigint(1) << 256, "Array too large for storage."); - return max(1, u256(size)); + return std::max(1, u256(size)); } -vector> ArrayType::makeStackItems() const +std::vector> ArrayType::makeStackItems() const { switch (m_location) { @@ -1833,9 +1832,9 @@ vector> ArrayType::makeStackItems() const solAssert(false, ""); } -string ArrayType::toString(bool _withoutDataLocation) const +std::string ArrayType::toString(bool _withoutDataLocation) const { - string ret; + std::string ret; if (isString()) ret = "string"; else if (isByteArrayOrString()) @@ -1852,9 +1851,9 @@ string ArrayType::toString(bool _withoutDataLocation) const return ret; } -string ArrayType::humanReadableName() const +std::string ArrayType::humanReadableName() const { - string ret; + std::string ret; if (isString()) ret = "string"; else if (isByteArrayOrString()) @@ -1870,9 +1869,9 @@ string ArrayType::humanReadableName() const return ret; } -string ArrayType::canonicalName() const +std::string ArrayType::canonicalName() const { - string ret; + std::string ret; if (isString()) ret = "string"; else if (isByteArrayOrString()) @@ -1887,7 +1886,7 @@ string ArrayType::canonicalName() const return ret; } -string ArrayType::signatureInExternalFunction(bool _structsByName) const +std::string ArrayType::signatureInExternalFunction(bool _structsByName) const { if (isByteArrayOrString()) return canonicalName(); @@ -1914,21 +1913,21 @@ MemberList::MemberMap ArrayType::nativeMembers(ASTNode const*) const members.emplace_back("push", TypeProvider::function( TypePointers{thisAsPointer}, TypePointers{baseType()}, - strings{string()}, - strings{string()}, + strings{std::string()}, + strings{std::string()}, FunctionType::Kind::ArrayPush )->withBoundFirstArgument()); members.emplace_back("push", TypeProvider::function( TypePointers{thisAsPointer, baseType()}, TypePointers{}, - strings{string(),string()}, + strings{std::string(),std::string()}, strings{}, FunctionType::Kind::ArrayPush )->withBoundFirstArgument()); members.emplace_back("pop", TypeProvider::function( TypePointers{thisAsPointer}, TypePointers{}, - strings{string()}, + strings{std::string()}, strings{}, FunctionType::Kind::ArrayPop )->withBoundFirstArgument()); @@ -2006,13 +2005,13 @@ u256 ArrayType::memoryDataSize() const solAssert(m_location == DataLocation::Memory, ""); solAssert(!isByteArrayOrString(), ""); bigint size = bigint(m_length) * m_baseType->memoryHeadSize(); - solAssert(size <= numeric_limits::max(), "Array size does not fit u256."); + solAssert(size <= std::numeric_limits::max(), "Array size does not fit u256."); return u256(size); } std::unique_ptr ArrayType::copyForLocation(DataLocation _location, bool _isPointer) const { - auto copy = make_unique(_location); + auto copy = std::make_unique(_location); if (_location == DataLocation::Storage) copy->m_isPointer = _isPointer; copy->m_arrayKind = m_arrayKind; @@ -2040,7 +2039,7 @@ BoolResult ArraySliceType::isExplicitlyConvertibleTo(Type const& _convertTo) con m_arrayType.isExplicitlyConvertibleTo(_convertTo); } -string ArraySliceType::richIdentifier() const +std::string ArraySliceType::richIdentifier() const { return m_arrayType.richIdentifier() + "_slice"; } @@ -2052,12 +2051,12 @@ bool ArraySliceType::operator==(Type const& _other) const return false; } -string ArraySliceType::toString(bool _withoutDataLocation) const +std::string ArraySliceType::toString(bool _withoutDataLocation) const { return m_arrayType.toString(_withoutDataLocation) + " slice"; } -string ArraySliceType::humanReadableName() const +std::string ArraySliceType::humanReadableName() const { return m_arrayType.humanReadableName() + " slice"; } @@ -2080,9 +2079,9 @@ std::vector> ArraySliceType::makeStackItems return {{"offset", TypeProvider::uint256()}, {"length", TypeProvider::uint256()}}; } -string ContractType::richIdentifier() const +std::string ContractType::richIdentifier() const { - return (m_super ? "t_super" : "t_contract") + parenthesizeUserIdentifier(m_contract.name()) + to_string(m_contract.id()); + return (m_super ? "t_super" : "t_contract") + parenthesizeUserIdentifier(m_contract.name()) + std::to_string(m_contract.id()); } bool ContractType::operator==(Type const& _other) const @@ -2093,15 +2092,15 @@ bool ContractType::operator==(Type const& _other) const return other.m_contract == m_contract && other.m_super == m_super; } -string ContractType::toString(bool) const +std::string ContractType::toString(bool) const { return - string(m_contract.isLibrary() ? "library " : "contract ") + - string(m_super ? "super " : "") + + std::string(m_contract.isLibrary() ? "library " : "contract ") + + std::string(m_super ? "super " : "") + m_contract.name(); } -string ContractType::canonicalName() const +std::string ContractType::canonicalName() const { return *m_contract.annotation().canonicalName; } @@ -2127,9 +2126,9 @@ FunctionType const* ContractType::newExpressionType() const return m_constructorType; } -vector> ContractType::stateVariables() const +std::vector> ContractType::stateVariables() const { - vector variables; + std::vector variables; for (ContractDefinition const* contract: m_contract.annotation().linearizedBaseContracts | ranges::views::reverse) for (VariableDeclaration const* variable: contract->stateVariables()) if (!(variable->isConstant() || variable->immutable())) @@ -2140,16 +2139,16 @@ vector> ContractType::stateVar StorageOffsets offsets; offsets.computeOffsets(types); - vector> variablesAndOffsets; + std::vector> variablesAndOffsets; for (size_t index = 0; index < variables.size(); ++index) if (auto const* offset = offsets.offset(index)) variablesAndOffsets.emplace_back(variables[index], offset->first, offset->second); return variablesAndOffsets; } -vector ContractType::immutableVariables() const +std::vector ContractType::immutableVariables() const { - vector variables; + std::vector variables; for (ContractDefinition const* contract: m_contract.annotation().linearizedBaseContracts | ranges::views::reverse) for (VariableDeclaration const* variable: contract->stateVariables()) if (variable->immutable()) @@ -2157,12 +2156,12 @@ vector ContractType::immutableVariables() const return variables; } -vector> ContractType::makeStackItems() const +std::vector> ContractType::makeStackItems() const { if (m_super) return {}; else - return {make_tuple("address", isPayable() ? TypeProvider::payableAddress() : TypeProvider::address())}; + return {std::make_tuple("address", isPayable() ? TypeProvider::payableAddress() : TypeProvider::address())}; } void StructType::clearCache() const @@ -2194,9 +2193,9 @@ BoolResult StructType::isImplicitlyConvertibleTo(Type const& _convertTo) const return this->m_struct == convertTo.m_struct; } -string StructType::richIdentifier() const +std::string StructType::richIdentifier() const { - return "t_struct" + parenthesizeUserIdentifier(m_struct.name()) + to_string(m_struct.id()) + identifierLocationSuffix(); + return "t_struct" + parenthesizeUserIdentifier(m_struct.name()) + std::to_string(m_struct.id()) + identifierLocationSuffix(); } bool StructType::operator==(Type const& _other) const @@ -2284,7 +2283,7 @@ bigint StructType::storageSizeUpperBound() const u256 StructType::storageSize() const { - return max(1, members(nullptr).storageSize()); + return std::max(1, members(nullptr).storageSize()); } bool StructType::containsNestedMapping() const @@ -2323,9 +2322,9 @@ bool StructType::containsNestedMapping() const return m_struct.annotation().containsNestedMapping.value(); } -string StructType::toString(bool _withoutDataLocation) const +std::string StructType::toString(bool _withoutDataLocation) const { - string ret = "struct " + *m_struct.annotation().canonicalName; + std::string ret = "struct " + *m_struct.annotation().canonicalName; if (!_withoutDataLocation) ret += " " + stringForReferencePart(); return ret; @@ -2482,20 +2481,20 @@ bool StructType::recursive() const std::unique_ptr StructType::copyForLocation(DataLocation _location, bool _isPointer) const { - auto copy = make_unique(m_struct, _location); + auto copy = std::make_unique(m_struct, _location); if (_location == DataLocation::Storage) copy->m_isPointer = _isPointer; return copy; } -string StructType::signatureInExternalFunction(bool _structsByName) const +std::string StructType::signatureInExternalFunction(bool _structsByName) const { if (_structsByName) return canonicalName(); else { TypePointers memberTypes = memoryMemberTypes(); - auto memberTypeStrings = memberTypes | ranges::views::transform([&](Type const* _t) -> string + auto memberTypeStrings = memberTypes | ranges::views::transform([&](Type const* _t) -> std::string { solAssert(_t, "Parameter should have external type."); auto t = _t->interfaceType(_structsByName); @@ -2506,7 +2505,7 @@ string StructType::signatureInExternalFunction(bool _structsByName) const } } -string StructType::canonicalName() const +std::string StructType::canonicalName() const { return *m_struct.annotation().canonicalName; } @@ -2530,14 +2529,14 @@ FunctionTypePointer StructType::constructorType() const ); } -pair const& StructType::storageOffsetsOfMember(string const& _name) const +std::pair const& StructType::storageOffsetsOfMember(std::string const& _name) const { auto const* offsets = members(nullptr).memberStorageOffset(_name); solAssert(offsets, "Storage offset of non-existing member requested."); return *offsets; } -u256 StructType::memoryOffsetOfMember(string const& _name) const +u256 StructType::memoryOffsetOfMember(std::string const& _name) const { u256 offset; for (auto const& member: members(nullptr)) @@ -2559,7 +2558,7 @@ TypePointers StructType::memoryMemberTypes() const return types; } -vector> StructType::makeStackItems() const +std::vector> StructType::makeStackItems() const { switch (m_location) { @@ -2573,9 +2572,9 @@ vector> StructType::makeStackItems() const solAssert(false, ""); } -vector StructType::decomposition() const +std::vector StructType::decomposition() const { - vector res; + std::vector res; for (MemberList::Member const& member: members(nullptr)) res.push_back(member.type); return res; @@ -2597,9 +2596,9 @@ TypeResult EnumType::unaryOperatorResult(Token _operator) const return _operator == Token::Delete ? TypeProvider::emptyTuple() : nullptr; } -string EnumType::richIdentifier() const +std::string EnumType::richIdentifier() const { - return "t_enum" + parenthesizeUserIdentifier(m_enum.name()) + to_string(m_enum.id()); + return "t_enum" + parenthesizeUserIdentifier(m_enum.name()) + std::to_string(m_enum.id()); } bool EnumType::operator==(Type const& _other) const @@ -2616,12 +2615,12 @@ unsigned EnumType::storageBytes() const return 1; } -string EnumType::toString(bool) const +std::string EnumType::toString(bool) const { - return string("enum ") + *m_enum.annotation().canonicalName; + return std::string("enum ") + *m_enum.annotation().canonicalName; } -string EnumType::canonicalName() const +std::string EnumType::canonicalName() const { return *m_enum.annotation().canonicalName; } @@ -2665,9 +2664,9 @@ Declaration const* UserDefinedValueType::typeDefinition() const return &m_definition; } -string UserDefinedValueType::richIdentifier() const +std::string UserDefinedValueType::richIdentifier() const { - return "t_userDefinedValueType" + parenthesizeIdentifier(m_definition.name()) + to_string(m_definition.id()); + return "t_userDefinedValueType" + parenthesizeIdentifier(m_definition.name()) + std::to_string(m_definition.id()); } bool UserDefinedValueType::operator==(Type const& _other) const @@ -2678,17 +2677,17 @@ bool UserDefinedValueType::operator==(Type const& _other) const return other.definition() == definition(); } -string UserDefinedValueType::toString(bool /* _withoutDataLocation */) const +std::string UserDefinedValueType::toString(bool /* _withoutDataLocation */) const { return *definition().annotation().canonicalName; } -string UserDefinedValueType::canonicalName() const +std::string UserDefinedValueType::canonicalName() const { return *definition().annotation().canonicalName; } -vector> UserDefinedValueType::makeStackItems() const +std::vector> UserDefinedValueType::makeStackItems() const { return underlyingType().stackItems(); } @@ -2713,7 +2712,7 @@ BoolResult TupleType::isImplicitlyConvertibleTo(Type const& _other) const return false; } -string TupleType::richIdentifier() const +std::string TupleType::richIdentifier() const { return "t_tuple" + identifierList(components()); } @@ -2726,22 +2725,22 @@ bool TupleType::operator==(Type const& _other) const return false; } -string TupleType::toString(bool _withoutDataLocation) const +std::string TupleType::toString(bool _withoutDataLocation) const { if (components().empty()) return "tuple()"; - string str = "tuple("; + std::string str = "tuple("; for (auto const& t: components()) str += (t ? t->toString(_withoutDataLocation) : "") + ","; str.pop_back(); return str + ")"; } -string TupleType::humanReadableName() const +std::string TupleType::humanReadableName() const { if (components().empty()) return "tuple()"; - string str = "tuple("; + std::string str = "tuple("; for (auto const& t: components()) str += (t ? t->humanReadableName() : "") + ","; str.pop_back(); @@ -2753,9 +2752,9 @@ u256 TupleType::storageSize() const solAssert(false, "Storage size of non-storable tuple type requested."); } -vector> TupleType::makeStackItems() const +std::vector> TupleType::makeStackItems() const { - vector> slots; + std::vector> slots; unsigned i = 1; for (auto const& t: components()) { @@ -2990,11 +2989,11 @@ FunctionTypePointer FunctionType::newExpressionType(ContractDefinition const& _c ); } -vector FunctionType::parameterNames() const +std::vector FunctionType::parameterNames() const { if (!hasBoundFirstArgument()) return m_parameterNames; - return vector(m_parameterNames.cbegin() + 1, m_parameterNames.cend()); + return std::vector(m_parameterNames.cbegin() + 1, m_parameterNames.cend()); } TypePointers FunctionType::returnParameterTypesWithoutDynamicTypes() const @@ -3031,9 +3030,9 @@ TypePointers const& FunctionType::parameterTypesIncludingSelf() const return m_parameterTypes; } -string FunctionType::richIdentifier() const +std::string FunctionType::richIdentifier() const { - string id = "t_function_"; + std::string id = "t_function_"; switch (m_kind) { case Kind::Declaration: id += "declaration"; break; @@ -3178,13 +3177,13 @@ TypeResult FunctionType::binaryOperatorResult(Token _operator, Type const* _othe return nullptr; } -string FunctionType::canonicalName() const +std::string FunctionType::canonicalName() const { solAssert(m_kind == Kind::External, ""); return "function"; } -string FunctionType::humanReadableName() const +std::string FunctionType::humanReadableName() const { switch (m_kind) { @@ -3197,9 +3196,9 @@ string FunctionType::humanReadableName() const } } -string FunctionType::toString(bool _withoutDataLocation) const +std::string FunctionType::toString(bool _withoutDataLocation) const { - string name = "function "; + std::string name = "function "; if (m_kind == Kind::Declaration) { auto const* functionDefinition = dynamic_cast(m_declaration); @@ -3263,9 +3262,9 @@ bool FunctionType::nameable() const !saltSet(); } -vector> FunctionType::makeStackItems() const +std::vector> FunctionType::makeStackItems() const { - vector> slots; + std::vector> slots; Kind kind = m_kind; if (m_kind == Kind::SetGas || m_kind == Kind::SetValue) { @@ -3278,8 +3277,8 @@ vector> FunctionType::makeStackItems() const case Kind::External: case Kind::DelegateCall: slots = { - make_tuple("address", TypeProvider::address()), - make_tuple("functionSelector", TypeProvider::uint(32)) + std::make_tuple("address", TypeProvider::address()), + std::make_tuple("functionSelector", TypeProvider::uint(32)) }; break; case Kind::BareCall: @@ -3288,10 +3287,10 @@ vector> FunctionType::makeStackItems() const case Kind::BareStaticCall: case Kind::Transfer: case Kind::Send: - slots = {make_tuple("address", TypeProvider::address())}; + slots = {std::make_tuple("address", TypeProvider::address())}; break; case Kind::Internal: - slots = {make_tuple("functionIdentifier", TypeProvider::uint256())}; + slots = {std::make_tuple("functionIdentifier", TypeProvider::uint256())}; break; case Kind::ArrayPush: case Kind::ArrayPop: @@ -3597,7 +3596,7 @@ bool FunctionType::isBareCall() const } } -string FunctionType::externalSignature() const +std::string FunctionType::externalSignature() const { solAssert(m_declaration != nullptr, "External signature of function needs declaration"); solAssert(!m_declaration->name().empty(), "Fallback function has no signature."); @@ -3624,9 +3623,9 @@ string FunctionType::externalSignature() const solAssert(extParams.message().empty(), extParams.message()); - auto typeStrings = extParams.get() | ranges::views::transform([&](Type const* _t) -> string + auto typeStrings = extParams.get() | ranges::views::transform([&](Type const* _t) -> std::string { - string typeName = _t->signatureInExternalFunction(inLibrary); + std::string typeName = _t->signatureInExternalFunction(inLibrary); if (inLibrary && _t->dataStoredIn(DataLocation::Storage)) typeName += " storage"; @@ -3640,7 +3639,7 @@ u256 FunctionType::externalIdentifier() const return util::selectorFromSignatureU32(externalSignature()); } -string FunctionType::externalIdentifierHex() const +std::string FunctionType::externalIdentifierHex() const { return util::selectorFromSignatureH32(externalSignature()).hex(); } @@ -3672,7 +3671,7 @@ TypePointers FunctionType::parseElementaryTypeVector(strings const& _types) { TypePointers pointers; pointers.reserve(_types.size()); - for (string const& type: _types) + for (std::string const& type: _types) pointers.push_back(TypeProvider::fromElementaryTypeName(type)); return pointers; } @@ -3797,7 +3796,7 @@ Type const* MappingType::encodingType() const return TypeProvider::integer(256, IntegerType::Modifier::Unsigned); } -string MappingType::richIdentifier() const +std::string MappingType::richIdentifier() const { return "t_mapping" + identifierList(m_keyType, m_valueType); } @@ -3810,12 +3809,12 @@ bool MappingType::operator==(Type const& _other) const return *other.m_keyType == *m_keyType && *other.m_valueType == *m_valueType; } -string MappingType::toString(bool _withoutDataLocation) const +std::string MappingType::toString(bool _withoutDataLocation) const { return "mapping(" + keyType()->toString(_withoutDataLocation) + " => " + valueType()->toString(_withoutDataLocation) + ")"; } -string MappingType::canonicalName() const +std::string MappingType::canonicalName() const { return "mapping(" + keyType()->canonicalName() + " => " + valueType()->canonicalName() + ")"; } @@ -3848,7 +3847,7 @@ std::vector> MappingType::makeStackItems() return {std::make_tuple("slot", TypeProvider::uint256())}; } -string TypeType::richIdentifier() const +std::string TypeType::richIdentifier() const { return "t_type" + identifierList(actualType()); } @@ -3866,13 +3865,13 @@ u256 TypeType::storageSize() const solAssert(false, "Storage size of non-storable type type requested."); } -vector> TypeType::makeStackItems() const +std::vector> TypeType::makeStackItems() const { if (auto contractType = dynamic_cast(m_actualType)) if (contractType->contractDefinition().isLibrary()) { solAssert(!contractType->isSuper(), ""); - return {make_tuple("address", TypeProvider::address())}; + return {std::make_tuple("address", TypeProvider::address())}; } return {}; @@ -3959,8 +3958,8 @@ MemberList::MemberMap TypeType::nativeMembers(ASTNode const* _currentScope) cons TypeProvider::function( TypePointers{&userDefined.underlyingType()}, TypePointers{&userDefined}, - strings{string{}}, - strings{string{}}, + strings{std::string{}}, + strings{std::string{}}, FunctionType::Kind::Wrap, StateMutability::Pure ) @@ -3970,8 +3969,8 @@ MemberList::MemberMap TypeType::nativeMembers(ASTNode const* _currentScope) cons TypeProvider::function( TypePointers{&userDefined}, TypePointers{&userDefined.underlyingType()}, - strings{string{}}, - strings{string{}}, + strings{std::string{}}, + strings{std::string{}}, FunctionType::Kind::Unwrap, StateMutability::Pure ) @@ -3985,7 +3984,7 @@ MemberList::MemberMap TypeType::nativeMembers(ASTNode const* _currentScope) cons TypePointers{}, TypePointers{arrayType->isString() ? TypeProvider::stringMemory() : TypeProvider::bytesMemory()}, strings{}, - strings{string{}}, + strings{std::string{}}, arrayType->isString() ? FunctionType::Kind::StringConcat : FunctionType::Kind::BytesConcat, StateMutability::Pure, nullptr, @@ -4017,7 +4016,7 @@ u256 ModifierType::storageSize() const solAssert(false, "Storage size of non-storable type type requested."); } -string ModifierType::richIdentifier() const +std::string ModifierType::richIdentifier() const { return "t_modifier" + identifierList(m_parameterTypes); } @@ -4042,17 +4041,17 @@ bool ModifierType::operator==(Type const& _other) const return true; } -string ModifierType::toString(bool _withoutDataLocation) const +std::string ModifierType::toString(bool _withoutDataLocation) const { - string name = "modifier ("; + std::string name = "modifier ("; for (auto it = m_parameterTypes.begin(); it != m_parameterTypes.end(); ++it) name += (*it)->toString(_withoutDataLocation) + (it + 1 == m_parameterTypes.end() ? "" : ","); return name + ")"; } -string ModuleType::richIdentifier() const +std::string ModuleType::richIdentifier() const { - return "t_module_" + to_string(m_sourceUnit.id()); + return "t_module_" + std::to_string(m_sourceUnit.id()); } bool ModuleType::operator==(Type const& _other) const @@ -4071,12 +4070,12 @@ MemberList::MemberMap ModuleType::nativeMembers(ASTNode const*) const return symbols; } -string ModuleType::toString(bool) const +std::string ModuleType::toString(bool) const { - return string("module \"") + *m_sourceUnit.annotation().path + string("\""); + return std::string("module \"") + *m_sourceUnit.annotation().path + std::string("\""); } -string MagicType::richIdentifier() const +std::string MagicType::richIdentifier() const { switch (m_kind) { @@ -4243,7 +4242,7 @@ MemberList::MemberMap MagicType::nativeMembers(ASTNode const*) const return {}; } -string MagicType::toString(bool _withoutDataLocation) const +std::string MagicType::toString(bool _withoutDataLocation) const { switch (m_kind) { diff --git a/scripts/check_style.sh b/scripts/check_style.sh index a396a7d76059..6a48034139cd 100755 --- a/scripts/check_style.sh +++ b/scripts/check_style.sh @@ -25,7 +25,8 @@ NAMESPACE_STD_FREE_FILES=( liblangutil/* libsmtutil/* libsolc/* - libsolidity/analysis/* + libsolidity/analysis/* + libsolidity/ast/* ) ( From ce423e5ae5673f5cc0f565371e26ed9a37861f94 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Mon, 14 Aug 2023 21:37:31 +0200 Subject: [PATCH 035/150] Purge using namespace std from libsolidity/codegen --- libsolidity/codegen/ABIFunctions.cpp | 181 +++-- libsolidity/codegen/ArrayUtils.cpp | 5 +- libsolidity/codegen/Compiler.cpp | 3 +- libsolidity/codegen/CompilerContext.cpp | 73 +- libsolidity/codegen/CompilerUtils.cpp | 37 +- libsolidity/codegen/ContractCompiler.cpp | 57 +- libsolidity/codegen/ExpressionCompiler.cpp | 45 +- libsolidity/codegen/LValue.cpp | 9 +- .../codegen/MultiUseYulFunctionCollector.cpp | 23 +- libsolidity/codegen/YulUtilFunctions.cpp | 622 +++++++++--------- libsolidity/codegen/ir/Common.cpp | 65 +- .../codegen/ir/IRGenerationContext.cpp | 11 +- libsolidity/codegen/ir/IRGenerator.cpp | 202 +++--- .../codegen/ir/IRGeneratorForStatements.cpp | 231 ++++--- libsolidity/codegen/ir/IRVariable.cpp | 15 +- scripts/check_style.sh | 2 + 16 files changed, 785 insertions(+), 796 deletions(-) diff --git a/libsolidity/codegen/ABIFunctions.cpp b/libsolidity/codegen/ABIFunctions.cpp index c92525f21211..bbcdb395b369 100644 --- a/libsolidity/codegen/ABIFunctions.cpp +++ b/libsolidity/codegen/ABIFunctions.cpp @@ -30,12 +30,11 @@ #include -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::frontend; -string ABIFunctions::tupleEncoder( +std::string ABIFunctions::tupleEncoder( TypePointers const& _givenTypes, TypePointers _targetTypes, bool _encodeAsLibraryTypes, @@ -56,7 +55,7 @@ string ABIFunctions::tupleEncoder( solAssert(t, ""); } - string functionName = string("abi_encode_tuple_"); + std::string functionName = std::string("abi_encode_tuple_"); for (auto const& t: _givenTypes) functionName += t->identifier() + "_"; functionName += "_to_"; @@ -76,8 +75,8 @@ string ABIFunctions::tupleEncoder( )"); templ("functionName", functionName); size_t const headSize_ = headSize(_targetTypes); - templ("headSize", to_string(headSize_)); - string encodeElements; + templ("headSize", std::to_string(headSize_)); + std::string encodeElements; size_t headPos = 0; size_t stackPos = 0; for (size_t i = 0; i < _givenTypes.size(); ++i) @@ -88,24 +87,24 @@ string ABIFunctions::tupleEncoder( bool dynamic = _targetTypes[i]->isDynamicallyEncoded(); Whiskers elementTempl( dynamic ? - string(R"( + std::string(R"( mstore(add(headStart, ), sub(tail, headStart)) tail := ( tail) )") : - string(R"( + std::string(R"( ( add(headStart, )) )") ); - string values = suffixedVariableNameList("value", stackPos, stackPos + sizeOnStack); + std::string values = suffixedVariableNameList("value", stackPos, stackPos + sizeOnStack); elementTempl("values", values.empty() ? "" : values + ", "); - elementTempl("pos", to_string(headPos)); + elementTempl("pos", std::to_string(headPos)); elementTempl("abiEncode", abiEncodingFunction(*_givenTypes[i], *_targetTypes[i], options)); encodeElements += elementTempl.render(); headPos += _targetTypes[i]->calldataHeadSize(); stackPos += sizeOnStack; } solAssert(headPos == headSize_, ""); - string valueParams = + std::string valueParams = _reversed ? suffixedVariableNameList("value", stackPos, 0) : suffixedVariableNameList("value", 0, stackPos); @@ -116,7 +115,7 @@ string ABIFunctions::tupleEncoder( }); } -string ABIFunctions::tupleEncoderPacked( +std::string ABIFunctions::tupleEncoderPacked( TypePointers const& _givenTypes, TypePointers _targetTypes, bool _reversed @@ -135,7 +134,7 @@ string ABIFunctions::tupleEncoderPacked( solAssert(t, ""); } - string functionName = string("abi_encode_tuple_packed_"); + std::string functionName = std::string("abi_encode_tuple_packed_"); for (auto const& t: _givenTypes) functionName += t->identifier() + "_"; functionName += "_to_"; @@ -154,7 +153,7 @@ string ABIFunctions::tupleEncoderPacked( } )"); templ("functionName", functionName); - string encodeElements; + std::string encodeElements; size_t stackPos = 0; for (size_t i = 0; i < _givenTypes.size(); ++i) { @@ -164,23 +163,23 @@ string ABIFunctions::tupleEncoderPacked( bool dynamic = _targetTypes[i]->isDynamicallyEncoded(); Whiskers elementTempl( dynamic ? - string(R"( + std::string(R"( pos := ( pos) )") : - string(R"( + std::string(R"( ( pos) pos := add(pos, ) )") ); - string values = suffixedVariableNameList("value", stackPos, stackPos + sizeOnStack); + std::string values = suffixedVariableNameList("value", stackPos, stackPos + sizeOnStack); elementTempl("values", values.empty() ? "" : values + ", "); if (!dynamic) - elementTempl("calldataEncodedSize", to_string(_targetTypes[i]->calldataEncodedSize(false))); + elementTempl("calldataEncodedSize", std::to_string(_targetTypes[i]->calldataEncodedSize(false))); elementTempl("abiEncode", abiEncodingFunction(*_givenTypes[i], *_targetTypes[i], options)); encodeElements += elementTempl.render(); stackPos += sizeOnStack; } - string valueParams = + std::string valueParams = _reversed ? suffixedVariableNameList("value", stackPos, 0) : suffixedVariableNameList("value", 0, stackPos); @@ -190,9 +189,9 @@ string ABIFunctions::tupleEncoderPacked( return templ.render(); }); } -string ABIFunctions::tupleDecoder(TypePointers const& _types, bool _fromMemory) +std::string ABIFunctions::tupleDecoder(TypePointers const& _types, bool _fromMemory) { - string functionName = string("abi_decode_tuple_"); + std::string functionName = std::string("abi_decode_tuple_"); for (auto const& t: _types) functionName += t->identifier(); if (_fromMemory) @@ -211,10 +210,10 @@ string ABIFunctions::tupleDecoder(TypePointers const& _types, bool _fromMemory) )"); templ("functionName", functionName); templ("revertString", revertReasonIfDebugFunction("ABI decoding: tuple data too short")); - templ("minimumSize", to_string(headSize(decodingTypes))); + templ("minimumSize", std::to_string(headSize(decodingTypes))); - string decodeElements; - vector valueReturnParams; + std::string decodeElements; + std::vector valueReturnParams; size_t headPos = 0; size_t stackPos = 0; for (size_t i = 0; i < _types.size(); ++i) @@ -224,11 +223,11 @@ string ABIFunctions::tupleDecoder(TypePointers const& _types, bool _fromMemory) size_t sizeOnStack = _types[i]->sizeOnStack(); solAssert(sizeOnStack == decodingTypes[i]->sizeOnStack(), ""); solAssert(sizeOnStack > 0, ""); - vector valueNamesLocal; + std::vector valueNamesLocal; for (size_t j = 0; j < sizeOnStack; j++) { - valueNamesLocal.emplace_back("value" + to_string(stackPos)); - valueReturnParams.emplace_back("value" + to_string(stackPos)); + valueNamesLocal.emplace_back("value" + std::to_string(stackPos)); + valueReturnParams.emplace_back("value" + std::to_string(stackPos)); stackPos++; } Whiskers elementTempl(R"( @@ -247,7 +246,7 @@ string ABIFunctions::tupleDecoder(TypePointers const& _types, bool _fromMemory) elementTempl("revertString", revertReasonIfDebugFunction("ABI decoding: invalid tuple offset")); elementTempl("load", _fromMemory ? "mload" : "calldataload"); elementTempl("values", boost::algorithm::join(valueNamesLocal, ", ")); - elementTempl("pos", to_string(headPos)); + elementTempl("pos", std::to_string(headPos)); elementTempl("abiDecode", abiDecodingFunction(*_types[i], _fromMemory, true)); decodeElements += elementTempl.render(); headPos += decodingTypes[i]->calldataHeadSize(); @@ -260,9 +259,9 @@ string ABIFunctions::tupleDecoder(TypePointers const& _types, bool _fromMemory) }); } -string ABIFunctions::EncodingOptions::toFunctionNameSuffix() const +std::string ABIFunctions::EncodingOptions::toFunctionNameSuffix() const { - string suffix; + std::string suffix; if (!padded) suffix += "_nonPadded"; if (dynamicInplace) @@ -274,7 +273,7 @@ string ABIFunctions::EncodingOptions::toFunctionNameSuffix() const return suffix; } -string ABIFunctions::abiEncodingFunction( +std::string ABIFunctions::abiEncodingFunction( Type const& _from, Type const& _to, EncodingOptions const& _options @@ -349,7 +348,7 @@ string ABIFunctions::abiEncodingFunction( solAssert(_from.sizeOnStack() == 1, ""); solAssert(to.isValueType(), ""); solAssert(to.calldataEncodedSize() == 32, ""); - string functionName = + std::string functionName = "abi_encode_" + _from.identifier() + "_to_" + @@ -376,7 +375,7 @@ string ABIFunctions::abiEncodingFunction( } else { - string cleanupConvert; + std::string cleanupConvert; if (_from == to) cleanupConvert = m_utils.cleanupFunction(_from) + "(value)"; else @@ -389,21 +388,21 @@ string ABIFunctions::abiEncodingFunction( }); } -string ABIFunctions::abiEncodeAndReturnUpdatedPosFunction( +std::string ABIFunctions::abiEncodeAndReturnUpdatedPosFunction( Type const& _givenType, Type const& _targetType, ABIFunctions::EncodingOptions const& _options ) { - string functionName = + std::string functionName = "abi_encodeUpdatedPos_" + _givenType.identifier() + "_to_" + _targetType.identifier() + _options.toFunctionNameSuffix(); return createFunction(functionName, [&]() { - string values = suffixedVariableNameList("value", 0, numVariablesForType(_givenType, _options)); - string encoder = abiEncodingFunction(_givenType, _targetType, _options); + std::string values = suffixedVariableNameList("value", 0, numVariablesForType(_givenType, _options)); + std::string encoder = abiEncodingFunction(_givenType, _targetType, _options); Type const* targetEncoding = _targetType.fullEncodingType(_options.encodeAsLibraryTypes, true, false); solAssert(targetEncoding, ""); if (targetEncoding->isDynamicallyEncoded()) @@ -435,7 +434,7 @@ string ABIFunctions::abiEncodeAndReturnUpdatedPosFunction( }); } -string ABIFunctions::abiEncodingFunctionCalldataArrayWithoutCleanup( +std::string ABIFunctions::abiEncodingFunctionCalldataArrayWithoutCleanup( Type const& _from, Type const& _to, EncodingOptions const& _options @@ -461,7 +460,7 @@ string ABIFunctions::abiEncodingFunctionCalldataArrayWithoutCleanup( "" ); - string functionName = + std::string functionName = "abi_encode_" + _from.identifier() + "_to_" + @@ -522,13 +521,13 @@ string ABIFunctions::abiEncodingFunctionCalldataArrayWithoutCleanup( }); } -string ABIFunctions::abiEncodingFunctionSimpleArray( +std::string ABIFunctions::abiEncodingFunctionSimpleArray( ArrayType const& _from, ArrayType const& _to, EncodingOptions const& _options ) { - string functionName = + std::string functionName = "abi_encode_" + _from.identifier() + "_to_" + @@ -548,7 +547,7 @@ string ABIFunctions::abiEncodingFunctionSimpleArray( EncodingOptions subOptions(_options); subOptions.encodeFunctionFromStack = false; subOptions.padded = true; - string elementValues = suffixedVariableNameList("elementValue", 0, numVariablesForType(*_from.baseType(), subOptions)); + std::string elementValues = suffixedVariableNameList("elementValue", 0, numVariablesForType(*_from.baseType(), subOptions)); Whiskers templ( usesTail ? R"( @@ -632,13 +631,13 @@ string ABIFunctions::abiEncodingFunctionSimpleArray( }); } -string ABIFunctions::abiEncodingFunctionMemoryByteArray( +std::string ABIFunctions::abiEncodingFunctionMemoryByteArray( ArrayType const& _from, ArrayType const& _to, EncodingOptions const& _options ) { - string functionName = + std::string functionName = "abi_encode_" + _from.identifier() + "_to_" + @@ -669,13 +668,13 @@ string ABIFunctions::abiEncodingFunctionMemoryByteArray( }); } -string ABIFunctions::abiEncodingFunctionCompactStorageArray( +std::string ABIFunctions::abiEncodingFunctionCompactStorageArray( ArrayType const& _from, ArrayType const& _to, EncodingOptions const& _options ) { - string functionName = + std::string functionName = "abi_encode_" + _from.identifier() + "_to_" + @@ -791,13 +790,13 @@ string ABIFunctions::abiEncodingFunctionCompactStorageArray( templ("useSpill", "1"); else templ("useSpill", "0"); - templ("itemsPerSlot", to_string(itemsPerSlot)); + templ("itemsPerSlot", std::to_string(itemsPerSlot)); templ("stride", toCompactHexWithPrefix(_to.calldataStride())); EncodingOptions subOptions(_options); subOptions.encodeFunctionFromStack = false; subOptions.padded = true; - string encodeToMemoryFun = abiEncodingFunction( + std::string encodeToMemoryFun = abiEncodingFunction( *_from.baseType(), *_to.baseType(), subOptions @@ -820,13 +819,13 @@ string ABIFunctions::abiEncodingFunctionCompactStorageArray( }); } -string ABIFunctions::abiEncodingFunctionStruct( +std::string ABIFunctions::abiEncodingFunctionStruct( StructType const& _from, StructType const& _to, EncodingOptions const& _options ) { - string functionName = + std::string functionName = "abi_encode_" + _from.identifier() + "_to_" + @@ -867,7 +866,7 @@ string ABIFunctions::abiEncodingFunctionStruct( templ("init", _from.dataStoredIn(DataLocation::Storage) ? "let slotValue := 0" : ""); u256 previousSlotOffset(-1); u256 encodingOffset = 0; - vector> members; + std::vector> members; for (auto const& member: _to.members(nullptr)) { solAssert(member.type, ""); @@ -890,7 +889,7 @@ string ABIFunctions::abiEncodingFunctionStruct( solAssert(memberTypeFrom->isValueType() == memberTypeTo->isValueType(), ""); u256 storageSlotOffset; size_t intraSlotOffset; - tie(storageSlotOffset, intraSlotOffset) = _from.storageOffsetsOfMember(member.name); + std::tie(storageSlotOffset, intraSlotOffset) = _from.storageOffsetsOfMember(member.name); if (memberTypeFrom->isValueType()) { if (storageSlotOffset != previousSlotOffset) @@ -910,13 +909,13 @@ string ABIFunctions::abiEncodingFunctionStruct( } case DataLocation::Memory: { - string sourceOffset = toCompactHexWithPrefix(_from.memoryOffsetOfMember(member.name)); + std::string sourceOffset = toCompactHexWithPrefix(_from.memoryOffsetOfMember(member.name)); members.back()["retrieveValue"] = "mload(add(value, " + sourceOffset + "))"; break; } case DataLocation::CallData: { - string sourceOffset = toCompactHexWithPrefix(_from.calldataOffsetOfMember(member.name)); + std::string sourceOffset = toCompactHexWithPrefix(_from.calldataOffsetOfMember(member.name)); members.back()["retrieveValue"] = calldataAccessFunction(*memberTypeFrom) + "(value, add(value, " + sourceOffset + "))"; break; } @@ -929,10 +928,10 @@ string ABIFunctions::abiEncodingFunctionStruct( // Like with arrays, struct members are always padded. subOptions.padded = true; - string memberValues = suffixedVariableNameList("memberValue", 0, numVariablesForType(*memberTypeFrom, subOptions)); + std::string memberValues = suffixedVariableNameList("memberValue", 0, numVariablesForType(*memberTypeFrom, subOptions)); members.back()["memberValues"] = memberValues; - string encode; + std::string encode; if (_options.dynamicInplace) encode = Whiskers{"pos := (, pos)"} ("encode", abiEncodeAndReturnUpdatedPosFunction(*memberTypeFrom, *memberTypeTo, subOptions)) @@ -942,7 +941,7 @@ string ABIFunctions::abiEncodingFunctionStruct( { Whiskers encodeTempl( dynamicMember ? - string(R"( + std::string(R"( mstore(add(pos, ), sub(tail, pos)) tail := (, tail) )") : @@ -966,7 +965,7 @@ string ABIFunctions::abiEncodingFunctionStruct( }); } -string ABIFunctions::abiEncodingFunctionStringLiteral( +std::string ABIFunctions::abiEncodingFunctionStringLiteral( Type const& _from, Type const& _to, EncodingOptions const& _options @@ -974,7 +973,7 @@ string ABIFunctions::abiEncodingFunctionStringLiteral( { solAssert(_from.category() == Type::Category::StringLiteral, ""); - string functionName = + std::string functionName = "abi_encode_" + _from.identifier() + "_to_" + @@ -982,7 +981,7 @@ string ABIFunctions::abiEncodingFunctionStringLiteral( _options.toFunctionNameSuffix(); return createFunction(functionName, [&]() { auto const& strType = dynamic_cast(_from); - string const& value = strType.value(); + std::string const& value = strType.value(); solAssert(_from.sizeOnStack() == 0, ""); if (_to.isDynamicallySized()) @@ -998,12 +997,12 @@ string ABIFunctions::abiEncodingFunctionStringLiteral( templ("functionName", functionName); // TODO this can make use of CODECOPY for large strings once we have that in Yul - templ("length", to_string(value.size())); + templ("length", std::to_string(value.size())); templ("storeLength", arrayStoreLengthForEncodingFunction(dynamic_cast(_to), _options)); if (_options.padded) - templ("overallSize", to_string(((value.size() + 31) / 32) * 32)); + templ("overallSize", std::to_string(((value.size() + 31) / 32) * 32)); else - templ("overallSize", to_string(value.size())); + templ("overallSize", std::to_string(value.size())); templ("storeLiteralInMemory", m_utils.storeLiteralInMemoryFunction(value)); return templ.render(); } @@ -1023,7 +1022,7 @@ string ABIFunctions::abiEncodingFunctionStringLiteral( }); } -string ABIFunctions::abiEncodingFunctionFunctionType( +std::string ABIFunctions::abiEncodingFunctionFunctionType( FunctionType const& _from, Type const& _to, EncodingOptions const& _options @@ -1036,7 +1035,7 @@ string ABIFunctions::abiEncodingFunctionFunctionType( "Invalid function type conversion requested" ); - string functionName = + std::string functionName = "abi_encode_" + _from.identifier() + "_to_" + @@ -1069,7 +1068,7 @@ string ABIFunctions::abiEncodingFunctionFunctionType( }); } -string ABIFunctions::abiDecodingFunction(Type const& _type, bool _fromMemory, bool _forUseOnStack) +std::string ABIFunctions::abiDecodingFunction(Type const& _type, bool _fromMemory, bool _forUseOnStack) { // The decoding function has to perform bounds checks unless it decodes a value type. // Conversely, bounds checks have to be performed before the decoding function @@ -1104,7 +1103,7 @@ string ABIFunctions::abiDecodingFunction(Type const& _type, bool _fromMemory, bo return abiDecodingFunctionValueType(_type, _fromMemory); } -string ABIFunctions::abiDecodingFunctionValueType(Type const& _type, bool _fromMemory) +std::string ABIFunctions::abiDecodingFunctionValueType(Type const& _type, bool _fromMemory) { Type const* decodingType = _type.decodingType(); solAssert(decodingType, ""); @@ -1113,7 +1112,7 @@ string ABIFunctions::abiDecodingFunctionValueType(Type const& _type, bool _fromM solAssert(!decodingType->isDynamicallyEncoded(), ""); solAssert(decodingType->calldataEncodedSize() == 32, ""); - string functionName = + std::string functionName = "abi_decode_" + _type.identifier() + (_fromMemory ? "_fromMemory" : ""); @@ -1134,17 +1133,17 @@ string ABIFunctions::abiDecodingFunctionValueType(Type const& _type, bool _fromM } -string ABIFunctions::abiDecodingFunctionArray(ArrayType const& _type, bool _fromMemory) +std::string ABIFunctions::abiDecodingFunctionArray(ArrayType const& _type, bool _fromMemory) { solAssert(_type.dataStoredIn(DataLocation::Memory), ""); - string functionName = + std::string functionName = "abi_decode_" + _type.identifier() + (_fromMemory ? "_fromMemory" : ""); return createFunction(functionName, [&]() { - string load = _fromMemory ? "mload" : "calldataload"; + std::string load = _fromMemory ? "mload" : "calldataload"; Whiskers templ( R"( // @@ -1166,14 +1165,14 @@ string ABIFunctions::abiDecodingFunctionArray(ArrayType const& _type, bool _from }); } -string ABIFunctions::abiDecodingFunctionArrayAvailableLength(ArrayType const& _type, bool _fromMemory) +std::string ABIFunctions::abiDecodingFunctionArrayAvailableLength(ArrayType const& _type, bool _fromMemory) { solAssert(_type.dataStoredIn(DataLocation::Memory), ""); if (_type.isByteArrayOrString()) return abiDecodingFunctionByteArrayAvailableLength(_type, _fromMemory); solAssert(_type.calldataStride() > 0, ""); - string functionName = + std::string functionName = "abi_decode_available_length_" + _type.identifier() + (_fromMemory ? "_fromMemory" : ""); @@ -1224,7 +1223,7 @@ string ABIFunctions::abiDecodingFunctionArrayAvailableLength(ArrayType const& _t }); } -string ABIFunctions::abiDecodingFunctionCalldataArray(ArrayType const& _type) +std::string ABIFunctions::abiDecodingFunctionCalldataArray(ArrayType const& _type) { solAssert(_type.dataStoredIn(DataLocation::CallData), ""); if (!_type.isDynamicallySized()) @@ -1232,7 +1231,7 @@ string ABIFunctions::abiDecodingFunctionCalldataArray(ArrayType const& _type) solAssert(_type.calldataStride() > 0, ""); solAssert(_type.calldataStride() < u256("0xffffffffffffffff"), ""); - string functionName = + std::string functionName = "abi_decode_" + _type.identifier(); return createFunction(functionName, [&]() { @@ -1273,12 +1272,12 @@ string ABIFunctions::abiDecodingFunctionCalldataArray(ArrayType const& _type) }); } -string ABIFunctions::abiDecodingFunctionByteArrayAvailableLength(ArrayType const& _type, bool _fromMemory) +std::string ABIFunctions::abiDecodingFunctionByteArrayAvailableLength(ArrayType const& _type, bool _fromMemory) { solAssert(_type.dataStoredIn(DataLocation::Memory), ""); solAssert(_type.isByteArrayOrString(), ""); - string functionName = + std::string functionName = "abi_decode_available_length_" + _type.identifier() + (_fromMemory ? "_fromMemory" : ""); @@ -1302,10 +1301,10 @@ string ABIFunctions::abiDecodingFunctionByteArrayAvailableLength(ArrayType const }); } -string ABIFunctions::abiDecodingFunctionCalldataStruct(StructType const& _type) +std::string ABIFunctions::abiDecodingFunctionCalldataStruct(StructType const& _type) { solAssert(_type.dataStoredIn(DataLocation::CallData), ""); - string functionName = + std::string functionName = "abi_decode_" + _type.identifier(); @@ -1321,15 +1320,15 @@ string ABIFunctions::abiDecodingFunctionCalldataStruct(StructType const& _type) w("revertString", revertReasonIfDebugFunction("ABI decoding: struct calldata too short")); w("functionName", functionName); w("readableTypeName", _type.toString(true)); - w("minimumSize", to_string(_type.isDynamicallyEncoded() ? _type.calldataEncodedTailSize() : _type.calldataEncodedSize(true))); + w("minimumSize", std::to_string(_type.isDynamicallyEncoded() ? _type.calldataEncodedTailSize() : _type.calldataEncodedSize(true))); return w.render(); }); } -string ABIFunctions::abiDecodingFunctionStruct(StructType const& _type, bool _fromMemory) +std::string ABIFunctions::abiDecodingFunctionStruct(StructType const& _type, bool _fromMemory) { solAssert(!_type.dataStoredIn(DataLocation::CallData), ""); - string functionName = + std::string functionName = "abi_decode_" + _type.identifier() + (_fromMemory ? "_fromMemory" : ""); @@ -1356,7 +1355,7 @@ string ABIFunctions::abiDecodingFunctionStruct(StructType const& _type, bool _fr solAssert(_type.memoryDataSize() < u256("0xffffffffffffffff"), ""); templ("memorySize", toCompactHexWithPrefix(_type.memoryDataSize())); size_t headPos = 0; - vector> members; + std::vector> members; for (auto const& member: _type.members(nullptr)) { solAssert(member.type, ""); @@ -1376,7 +1375,7 @@ string ABIFunctions::abiDecodingFunctionStruct(StructType const& _type, bool _fr // TODO add test memberTempl("revertString", revertReasonIfDebugFunction("ABI decoding: invalid struct offset")); memberTempl("load", _fromMemory ? "mload" : "calldataload"); - memberTempl("pos", to_string(headPos)); + memberTempl("pos", std::to_string(headPos)); memberTempl("memoryOffset", toCompactHexWithPrefix(_type.memoryOffsetOfMember(member.name))); memberTempl("abiDecode", abiDecodingFunction(*member.type, _fromMemory, false)); @@ -1391,11 +1390,11 @@ string ABIFunctions::abiDecodingFunctionStruct(StructType const& _type, bool _fr }); } -string ABIFunctions::abiDecodingFunctionFunctionType(FunctionType const& _type, bool _fromMemory, bool _forUseOnStack) +std::string ABIFunctions::abiDecodingFunctionFunctionType(FunctionType const& _type, bool _fromMemory, bool _forUseOnStack) { solAssert(_type.kind() == FunctionType::Kind::External, ""); - string functionName = + std::string functionName = "abi_decode_" + _type.identifier() + (_fromMemory ? "_fromMemory" : "") + @@ -1430,10 +1429,10 @@ string ABIFunctions::abiDecodingFunctionFunctionType(FunctionType const& _type, }); } -string ABIFunctions::calldataAccessFunction(Type const& _type) +std::string ABIFunctions::calldataAccessFunction(Type const& _type) { solAssert(_type.isValueType() || _type.dataStoredIn(DataLocation::CallData), ""); - string functionName = "calldata_access_" + _type.identifier(); + std::string functionName = "calldata_access_" + _type.identifier(); return createFunction(functionName, [&]() { if (_type.isDynamicallyEncoded()) { @@ -1477,7 +1476,7 @@ string ABIFunctions::calldataAccessFunction(Type const& _type) } else if (_type.isValueType()) { - string decodingFunction; + std::string decodingFunction; if (auto const* functionType = dynamic_cast(&_type)) decodingFunction = abiDecodingFunctionFunctionType(*functionType, false, false); else @@ -1510,9 +1509,9 @@ string ABIFunctions::calldataAccessFunction(Type const& _type) }); } -string ABIFunctions::arrayStoreLengthForEncodingFunction(ArrayType const& _type, EncodingOptions const& _options) +std::string ABIFunctions::arrayStoreLengthForEncodingFunction(ArrayType const& _type, EncodingOptions const& _options) { - string functionName = "array_storeLengthForEncoding_" + _type.identifier() + _options.toFunctionNameSuffix(); + std::string functionName = "array_storeLengthForEncoding_" + _type.identifier() + _options.toFunctionNameSuffix(); return createFunction(functionName, [&]() { if (_type.isDynamicallySized() && !_options.dynamicInplace) return Whiskers(R"( @@ -1534,7 +1533,7 @@ string ABIFunctions::arrayStoreLengthForEncodingFunction(ArrayType const& _type, }); } -string ABIFunctions::createFunction(string const& _name, function const& _creator) +std::string ABIFunctions::createFunction(std::string const& _name, std::function const& _creator) { return m_functionCollector.createFunction(_name, _creator); } diff --git a/libsolidity/codegen/ArrayUtils.cpp b/libsolidity/codegen/ArrayUtils.cpp index 609ff9993ba8..afcc38fe8a11 100644 --- a/libsolidity/codegen/ArrayUtils.cpp +++ b/libsolidity/codegen/ArrayUtils.cpp @@ -36,7 +36,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; using namespace solidity::frontend; @@ -314,7 +313,7 @@ void ArrayUtils::copyArrayToMemory(ArrayType const& _sourceType, bool _padToWord if (!_sourceType.isByteArrayOrString()) convertLengthToSize(_sourceType); - string routine = "calldatacopy(target, source, len)\n"; + std::string routine = "calldatacopy(target, source, len)\n"; if (_padToWordBoundaries) routine += R"( // Set padding suffix to zero @@ -890,7 +889,7 @@ void ArrayUtils::popStorageArrayElement(ArrayType const& _type) const sstore(ref, slot_value) })"); code("panicSelector", util::selectorFromSignatureU256("Panic(uint256)").str()); - code("emptyArrayPop", to_string(unsigned(util::PanicCode::EmptyArrayPop))); + code("emptyArrayPop", std::to_string(unsigned(util::PanicCode::EmptyArrayPop))); m_context.appendInlineAssembly(code.render(), {"ref", "slot_value", "length"}); m_context << Instruction::POP << Instruction::POP << Instruction::POP; } diff --git a/libsolidity/codegen/Compiler.cpp b/libsolidity/codegen/Compiler.cpp index c044760a022d..844de8ba82c6 100644 --- a/libsolidity/codegen/Compiler.cpp +++ b/libsolidity/codegen/Compiler.cpp @@ -26,13 +26,12 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::frontend; void Compiler::compileContract( ContractDefinition const& _contract, - std::map> const& _otherCompilers, + std::map> const& _otherCompilers, bytes const& _metadata ) { diff --git a/libsolidity/codegen/CompilerContext.cpp b/libsolidity/codegen/CompilerContext.cpp index bc69f82c57e8..d9264c6ac5f1 100644 --- a/libsolidity/codegen/CompilerContext.cpp +++ b/libsolidity/codegen/CompilerContext.cpp @@ -55,7 +55,6 @@ #undef SOL_OUTPUT_ASM -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::evmasm; @@ -68,7 +67,7 @@ void CompilerContext::addStateVariable( unsigned _byteOffset ) { - m_stateVariables[&_declaration] = make_pair(_storageOffset, _byteOffset); + m_stateVariables[&_declaration] = std::make_pair(_storageOffset, _byteOffset); } void CompilerContext::addImmutable(VariableDeclaration const& _variable) @@ -88,14 +87,14 @@ size_t CompilerContext::immutableMemoryOffset(VariableDeclaration const& _variab return m_immutableVariables.at(&_variable); } -vector CompilerContext::immutableVariableSlotNames(VariableDeclaration const& _variable) +std::vector CompilerContext::immutableVariableSlotNames(VariableDeclaration const& _variable) { - string baseName = to_string(_variable.id()); + std::string baseName = std::to_string(_variable.id()); solAssert(_variable.annotation().type->sizeOnStack() > 0, ""); if (_variable.annotation().type->sizeOnStack() == 1) return {baseName}; - vector names; - auto collectSlotNames = [&](string const& _baseName, Type const* type, auto const& _recurse) -> void { + std::vector names; + auto collectSlotNames = [&](std::string const& _baseName, Type const* type, auto const& _recurse) -> void { for (auto const& [slot, type]: type->stackItems()) if (type) _recurse(_baseName + " " + slot, type, _recurse); @@ -121,10 +120,10 @@ void CompilerContext::startFunction(Declaration const& _function) } void CompilerContext::callLowLevelFunction( - string const& _name, + std::string const& _name, unsigned _inArgs, unsigned _outArgs, - function const& _generator + std::function const& _generator ) { evmasm::AssemblyItem retTag = pushNewTag(); @@ -138,7 +137,7 @@ void CompilerContext::callLowLevelFunction( } void CompilerContext::callYulFunction( - string const& _name, + std::string const& _name, unsigned _inArgs, unsigned _outArgs ) @@ -152,10 +151,10 @@ void CompilerContext::callYulFunction( } evmasm::AssemblyItem CompilerContext::lowLevelFunctionTag( - string const& _name, + std::string const& _name, unsigned _inArgs, unsigned _outArgs, - function const& _generator + std::function const& _generator ) { auto it = m_lowLevelFunctions.find(_name); @@ -174,10 +173,10 @@ void CompilerContext::appendMissingLowLevelFunctions() { while (!m_lowLevelFunctionGenerationQueue.empty()) { - string name; + std::string name; unsigned inArgs; unsigned outArgs; - function generator; + std::function generator; tie(name, inArgs, outArgs, generator) = m_lowLevelFunctionGenerationQueue.front(); m_lowLevelFunctionGenerationQueue.pop(); @@ -195,7 +194,7 @@ void CompilerContext::appendYulUtilityFunctions(OptimiserSettings const& _optimi solAssert(!m_appendYulUtilityFunctionsRan, "requestedYulFunctions called more than once."); m_appendYulUtilityFunctionsRan = true; - string code = m_yulFunctionCollector.requestedFunctions(); + std::string code = m_yulFunctionCollector.requestedFunctions(); if (!code.empty()) { appendInlineAssembly( @@ -233,7 +232,7 @@ void CompilerContext::removeVariable(Declaration const& _declaration) void CompilerContext::removeVariablesAboveStackHeight(unsigned _stackHeight) { - vector toRemove; + std::vector toRemove; for (auto _var: m_localVariables) { solAssert(!_var.second.empty(), ""); @@ -250,14 +249,14 @@ unsigned CompilerContext::numberOfLocalVariables() const return static_cast(m_localVariables.size()); } -shared_ptr CompilerContext::compiledContract(ContractDefinition const& _contract) const +std::shared_ptr CompilerContext::compiledContract(ContractDefinition const& _contract) const { auto ret = m_otherCompilers.find(&_contract); solAssert(ret != m_otherCompilers.end(), "Compiled contract not found."); return ret->second->assemblyPtr(); } -shared_ptr CompilerContext::compiledContractRuntime(ContractDefinition const& _contract) const +std::shared_ptr CompilerContext::compiledContractRuntime(ContractDefinition const& _contract) const { auto ret = m_otherCompilers.find(&_contract); solAssert(ret != m_otherCompilers.end(), "Compiled contract not found."); @@ -320,7 +319,7 @@ unsigned CompilerContext::currentToBaseStackOffset(unsigned _offset) const return static_cast(m_asm->deposit()) - _offset - 1; } -pair CompilerContext::storageLocationOfVariable(Declaration const& _declaration) const +std::pair CompilerContext::storageLocationOfVariable(Declaration const& _declaration) const { auto it = m_stateVariables.find(&_declaration); solAssert(it != m_stateVariables.end(), "Variable not found in storage."); @@ -349,13 +348,13 @@ CompilerContext& CompilerContext::appendConditionalPanic(util::PanicCode _code) return *this; } -CompilerContext& CompilerContext::appendRevert(string const& _message) +CompilerContext& CompilerContext::appendRevert(std::string const& _message) { appendInlineAssembly("{ " + revertReasonIfDebug(_message) + " }"); return *this; } -CompilerContext& CompilerContext::appendConditionalRevert(bool _forwardReturnData, string const& _message) +CompilerContext& CompilerContext::appendConditionalRevert(bool _forwardReturnData, std::string const& _message) { if (_forwardReturnData && m_evmVersion.supportsReturndata()) appendInlineAssembly(R"({ @@ -372,24 +371,24 @@ CompilerContext& CompilerContext::appendConditionalRevert(bool _forwardReturnDat void CompilerContext::resetVisitedNodes(ASTNode const* _node) { - stack newStack; + std::stack newStack; newStack.push(_node); std::swap(m_visitedNodes, newStack); updateSourceLocation(); } void CompilerContext::appendInlineAssembly( - string const& _assembly, - vector const& _localVariables, - set const& _externallyUsedFunctions, + std::string const& _assembly, + std::vector const& _localVariables, + std::set const& _externallyUsedFunctions, bool _system, OptimiserSettings const& _optimiserSettings, - string _sourceName + std::string _sourceName ) { unsigned startStackHeight = stackHeight(); - set externallyUsedIdentifiers; + std::set externallyUsedIdentifiers; for (auto const& fun: _externallyUsedFunctions) externallyUsedIdentifiers.insert(yul::YulString(fun)); for (auto const& var: _localVariables) @@ -438,19 +437,19 @@ void CompilerContext::appendInlineAssembly( ErrorReporter errorReporter(errors); langutil::CharStream charStream(_assembly, _sourceName); yul::EVMDialect const& dialect = yul::EVMDialect::strictAssemblyForEVM(m_evmVersion); - optional locationOverride; + std::optional locationOverride; if (!_system) locationOverride = m_asm->currentSourceLocation(); - shared_ptr parserResult = + std::shared_ptr parserResult = yul::Parser(errorReporter, dialect, std::move(locationOverride)) .parse(charStream); #ifdef SOL_OUTPUT_ASM cout << yul::AsmPrinter(&dialect)(*parserResult) << endl; #endif - auto reportError = [&](string const& _context) + auto reportError = [&](std::string const& _context) { - string message = + std::string message = "Error parsing/analyzing inline assembly block:\n" + _context + "\n" "------------------ Input: -----------------\n" + @@ -483,7 +482,7 @@ void CompilerContext::appendInlineAssembly( { yul::Object obj; obj.code = parserResult; - obj.analysisInfo = make_shared(analysisInfo); + obj.analysisInfo = std::make_shared(analysisInfo); solAssert(!dialect.providesObjectAccess()); optimizeYul(obj, dialect, _optimiserSettings, externallyUsedIdentifiers); @@ -493,7 +492,7 @@ void CompilerContext::appendInlineAssembly( // Store as generated sources, but first re-parse to update the source references. solAssert(m_generatedYulUtilityCode.empty(), ""); m_generatedYulUtilityCode = yul::AsmPrinter(dialect)(*obj.code); - string code = yul::AsmPrinter{dialect}(*obj.code); + std::string code = yul::AsmPrinter{dialect}(*obj.code); langutil::CharStream charStream(m_generatedYulUtilityCode, _sourceName); obj.code = yul::Parser(errorReporter, dialect).parse(charStream); *obj.analysisInfo = yul::AsmAnalyzer::analyzeStrictAssertCorrect(dialect, obj); @@ -548,7 +547,7 @@ void CompilerContext::optimizeYul(yul::Object& _object, yul::EVMDialect const& _ _optimiserSettings.optimizeStackAllocation, _optimiserSettings.yulOptimiserSteps, _optimiserSettings.yulOptimiserCleanupSteps, - isCreation? nullopt : make_optional(_optimiserSettings.expectedExecutionsPerDeployment), + isCreation? std::nullopt : std::make_optional(_optimiserSettings.expectedExecutionsPerDeployment), _externalIdentifiers ); @@ -558,11 +557,11 @@ void CompilerContext::optimizeYul(yul::Object& _object, yul::EVMDialect const& _ #endif } -string CompilerContext::revertReasonIfDebug(string const& _message) +std::string CompilerContext::revertReasonIfDebug(std::string const& _message) { return YulUtilFunctions::revertReasonIfDebugBody( m_revertStrings, - "mload(" + to_string(CompilerUtils::freeMemoryPointer) + ")", + "mload(" + std::to_string(CompilerUtils::freeMemoryPointer) + ")", _message ); } @@ -590,14 +589,14 @@ evmasm::AssemblyItem CompilerContext::FunctionCompilationQueue::entryLabel( } // some name that cannot clash with yul function names. - string labelName = "@" + _declaration.name() + "_" + to_string(_declaration.id()); + std::string labelName = "@" + _declaration.name() + "_" + std::to_string(_declaration.id()); evmasm::AssemblyItem tag = _context.namedTag( labelName, params, returns, _declaration.id() ); - m_entryLabels.insert(make_pair(&_declaration, tag)); + m_entryLabels.insert(std::make_pair(&_declaration, tag)); m_functionsToCompile.push(&_declaration); return tag.tag(); } diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp index 783a7b1a45f3..bf4f25bf289e 100644 --- a/libsolidity/codegen/CompilerUtils.cpp +++ b/libsolidity/codegen/CompilerUtils.cpp @@ -33,7 +33,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; using namespace solidity::frontend; @@ -105,9 +104,9 @@ void CompilerUtils::revertWithStringData(Type const& _argumentType) } void CompilerUtils::revertWithError( - string const& _signature, - vector const& _parameterTypes, - vector const& _argumentTypes + std::string const& _signature, + std::vector const& _parameterTypes, + std::vector const& _argumentTypes ) { fetchFreeMemoryPointer(); @@ -215,7 +214,7 @@ void CompilerUtils::storeInMemoryDynamic(Type const& _type, bool _padToWordBound m_context << Instruction::DUP1; storeStringData(bytesConstRef(str->value())); if (_padToWordBoundaries) - m_context << u256(max(32, ((str->value().size() + 31) / 32) * 32)); + m_context << u256(std::max(32, ((str->value().size() + 31) / 32) * 32)); else m_context << u256(str->value().size()); m_context << Instruction::ADD; @@ -264,7 +263,7 @@ void CompilerUtils::abiDecode(TypePointers const& _typeParameters, bool _fromMem Whiskers templ(R"({ if lt(len, ) { } })"); - templ("encodedSize", to_string(encodedSize)); + templ("encodedSize", std::to_string(encodedSize)); templ("revertString", m_context.revertReasonIfDebug("Calldata too short")); m_context.appendInlineAssembly(templ.render(), {"len"}); @@ -320,7 +319,7 @@ void CompilerUtils::abiDecode(TypePointers const& _typeParameters, bool _fromMem mstore(dst, array_length) dst := add(dst, 0x20) })"); - templ("item_size", to_string(arrayType.calldataStride())); + templ("item_size", std::to_string(arrayType.calldataStride())); // TODO add test templ("revertStringPointer", m_context.revertReasonIfDebug("ABI memory decoding: invalid data pointer")); templ("revertStringStart", m_context.revertReasonIfDebug("ABI memory decoding: invalid data start")); @@ -374,7 +373,7 @@ void CompilerUtils::abiDecode(TypePointers const& _typeParameters, bool _fromMem m_context.appendInlineAssembly(Whiskers(R"({ if or( gt(array_length, 0x100000000), - gt(add(data_ptr, mul(array_length, )" + to_string(arrayType.calldataStride()) + R"()), input_end) + gt(add(data_ptr, mul(array_length, )" + std::to_string(arrayType.calldataStride()) + R"()), input_end) ) { } })") ("revertString", m_context.revertReasonIfDebug("ABI calldata decoding: invalid data pointer")) @@ -618,7 +617,7 @@ void CompilerUtils::abiEncodeV2( // stack: <$value0> <$value1> ... <$value(n-1)> <$headStart> - string encoderName = + std::string encoderName = _padToWordBoundaries ? m_context.abiFunctions().tupleEncoderReversed(_givenTypes, _targetTypes, _encodeAsLibraryTypes) : m_context.abiFunctions().tupleEncoderPackedReversed(_givenTypes, _targetTypes); @@ -631,7 +630,7 @@ void CompilerUtils::abiDecodeV2(TypePointers const& _parameterTypes, bool _fromM m_context << Instruction::DUP2 << Instruction::ADD; m_context << Instruction::SWAP1; // stack: - string decoderName = m_context.abiFunctions().tupleDecoder(_parameterTypes, _fromMemory); + std::string decoderName = m_context.abiFunctions().tupleDecoder(_parameterTypes, _fromMemory); m_context.callYulFunction(decoderName, 2, sizeOnStack(_parameterTypes)); } @@ -646,7 +645,7 @@ void CompilerUtils::zeroInitialiseMemoryArray(ArrayType const& _type) calldatacopy(memptr, calldatasize(), size) memptr := add(memptr, size) })"); - templ("element_size", to_string(_type.memoryStride())); + templ("element_size", std::to_string(_type.memoryStride())); m_context.appendInlineAssembly(templ.render(), {"length", "memptr"}); } else @@ -842,7 +841,7 @@ void CompilerUtils::convertType( m_context << Instruction::POP << u256(0); else if (targetType.numBytes() > typeOnStack.numBytes() || _cleanupNeeded) { - unsigned bytes = min(typeOnStack.numBytes(), targetType.numBytes()); + unsigned bytes = std::min(typeOnStack.numBytes(), targetType.numBytes()); m_context << ((u256(1) << (256 - bytes * 8)) - 1); m_context << Instruction::NOT << Instruction::AND; } @@ -960,7 +959,7 @@ void CompilerUtils::convertType( case Type::Category::StringLiteral: { auto const& literalType = dynamic_cast(_typeOnStack); - string const& value = literalType.value(); + std::string const& value = literalType.value(); bytesConstRef data(value); if (targetTypeCategory == Type::Category::FixedBytes) { @@ -1186,7 +1185,7 @@ void CompilerUtils::convertType( for (auto const& member: typeOnStack->members(nullptr)) { solAssert(!member.type->containsNestedMapping()); - pair const& offsets = typeOnStack->storageOffsetsOfMember(member.name); + std::pair const& offsets = typeOnStack->storageOffsetsOfMember(member.name); _context << offsets.first << Instruction::DUP3 << Instruction::ADD; _context << u256(offsets.second); StorageItem(_context, *member.type).retrieveValue(SourceLocation(), true); @@ -1268,7 +1267,7 @@ void CompilerUtils::convertType( if (sourceSize > 0 || targetSize > 0) { // Move it back into its place. - for (unsigned j = 0; j < min(sourceSize, targetSize); ++j) + for (unsigned j = 0; j < std::min(sourceSize, targetSize); ++j) m_context << swapInstruction(depth + targetSize - sourceSize) << Instruction::POP; @@ -1375,7 +1374,7 @@ void CompilerUtils::pushZeroValue(Type const& _type) [type](CompilerContext& _context) { CompilerUtils utils(_context); - utils.allocateMemory(max(32u, type->memoryDataSize())); + utils.allocateMemory(std::max(32u, type->memoryDataSize())); _context << Instruction::DUP1; if (auto structType = dynamic_cast(type)) @@ -1493,7 +1492,7 @@ void CompilerUtils::popAndJump(unsigned _toHeight, evmasm::AssemblyItem const& _ m_context.adjustStackOffset(static_cast(amount)); } -unsigned CompilerUtils::sizeOnStack(vector const& _variableTypes) +unsigned CompilerUtils::sizeOnStack(std::vector const& _variableTypes) { unsigned size = 0; for (Type const* type: _variableTypes) @@ -1509,7 +1508,7 @@ void CompilerUtils::computeHashStatic() void CompilerUtils::copyContractCodeToMemory(ContractDefinition const& contract, bool _creation) { - string which = _creation ? "Creation" : "Runtime"; + std::string which = _creation ? "Creation" : "Runtime"; m_context.callLowLevelFunction( "$copyContract" + which + "CodeToMemory_" + contract.type()->identifier(), 1, @@ -1517,7 +1516,7 @@ void CompilerUtils::copyContractCodeToMemory(ContractDefinition const& contract, [&contract, _creation](CompilerContext& _context) { // copy the contract's code into memory - shared_ptr assembly = + std::shared_ptr assembly = _creation ? _context.compiledContract(contract) : _context.compiledContractRuntime(contract); diff --git a/libsolidity/codegen/ContractCompiler.cpp b/libsolidity/codegen/ContractCompiler.cpp index a6e7ab2fb330..3dfdf76d879c 100644 --- a/libsolidity/codegen/ContractCompiler.cpp +++ b/libsolidity/codegen/ContractCompiler.cpp @@ -55,7 +55,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; using namespace solidity::frontend; @@ -80,7 +79,7 @@ class StackHeightChecker { solAssert( m_context.stackHeight() == stackHeight, - std::string("I sense a disturbance in the stack: ") + to_string(m_context.stackHeight()) + " vs " + to_string(stackHeight) + std::string("I sense a disturbance in the stack: ") + std::to_string(m_context.stackHeight()) + " vs " + std::to_string(stackHeight) ); } private: @@ -92,7 +91,7 @@ class StackHeightChecker void ContractCompiler::compileContract( ContractDefinition const& _contract, - map> const& _otherCompilers + std::map> const& _otherCompilers ) { CompilerContext::LocationSetter locationSetter(m_context, _contract); @@ -111,7 +110,7 @@ void ContractCompiler::compileContract( size_t ContractCompiler::compileConstructor( ContractDefinition const& _contract, - std::map> const& _otherCompilers + std::map> const& _otherCompilers ) { CompilerContext::LocationSetter locationSetter(m_context, _contract); @@ -126,7 +125,7 @@ size_t ContractCompiler::compileConstructor( void ContractCompiler::initializeContext( ContractDefinition const& _contract, - map> const& _otherCompilers + std::map> const& _otherCompilers ) { m_context.setUseABICoderV2(*_contract.sourceUnit().annotation().useABICoderV2); @@ -187,7 +186,7 @@ size_t ContractCompiler::packIntoContractCreator(ContractDefinition const& _cont CompilerContext::LocationSetter locationSetter(m_context, _contract); m_context << deployRoutine; - solAssert(m_context.runtimeSub() != numeric_limits::max(), "Runtime sub not registered"); + solAssert(m_context.runtimeSub() != std::numeric_limits::max(), "Runtime sub not registered"); ContractType contractType(_contract); auto const& immutables = contractType.immutableVariables(); @@ -231,7 +230,7 @@ size_t ContractCompiler::deployLibrary(ContractDefinition const& _contract) CompilerContext::LocationSetter locationSetter(m_context, _contract); - solAssert(m_context.runtimeSub() != numeric_limits::max(), "Runtime sub not registered"); + solAssert(m_context.runtimeSub() != std::numeric_limits::max(), "Runtime sub not registered"); m_context.pushSubroutineSize(m_context.runtimeSub()); m_context.pushSubroutineOffset(m_context.runtimeSub()); // This code replaces the address added by appendDeployTimeAddress(). @@ -324,8 +323,8 @@ void ContractCompiler::appendDelegatecallCheck() } void ContractCompiler::appendInternalSelector( - map, evmasm::AssemblyItem const> const& _entryPoints, - vector> const& _ids, + std::map, evmasm::AssemblyItem const> const& _entryPoints, + std::vector> const& _ids, evmasm::AssemblyItem const& _notFoundTag, size_t _runs ) @@ -369,11 +368,11 @@ void ContractCompiler::appendInternalSelector( m_context << dupInstruction(1) << u256(FixedHash<4>::Arith(pivot)) << Instruction::GT; evmasm::AssemblyItem lessTag{m_context.appendConditionalJump()}; // Here, we have funid >= pivot - vector> larger{_ids.begin() + static_cast(pivotIndex), _ids.end()}; + std::vector> larger{_ids.begin() + static_cast(pivotIndex), _ids.end()}; appendInternalSelector(_entryPoints, larger, _notFoundTag, _runs); m_context << lessTag; // Here, we have funid < pivot - vector> smaller{_ids.begin(), _ids.begin() + static_cast(pivotIndex)}; + std::vector> smaller{_ids.begin(), _ids.begin() + static_cast(pivotIndex)}; appendInternalSelector(_entryPoints, smaller, _notFoundTag, _runs); } else @@ -411,8 +410,8 @@ bool hasPayableFunctions(ContractDefinition const& _contract) void ContractCompiler::appendFunctionSelector(ContractDefinition const& _contract) { - map, FunctionTypePointer> interfaceFunctions = _contract.interfaceFunctions(); - map, evmasm::AssemblyItem const> callDataUnpackerEntryPoints; + std::map, FunctionTypePointer> interfaceFunctions = _contract.interfaceFunctions(); + std::map, evmasm::AssemblyItem const> callDataUnpackerEntryPoints; if (_contract.isLibrary()) { @@ -448,7 +447,7 @@ void ContractCompiler::appendFunctionSelector(ContractDefinition const& _contrac CompilerUtils(m_context).loadFromMemory(0, IntegerType(CompilerUtils::dataStartOffset * 8), true, false); // stack now is: ? - vector> sortedIDs; + std::vector> sortedIDs; for (auto const& it: interfaceFunctions) { callDataUnpackerEntryPoints.emplace(it.first, m_context.newTag()); @@ -572,7 +571,7 @@ void ContractCompiler::appendReturnValuePacker(TypePointers const& _typeParamete void ContractCompiler::registerStateVariables(ContractDefinition const& _contract) { for (auto const& var: ContractType(_contract).stateVariables()) - m_context.addStateVariable(*get<0>(var), get<1>(var), get<2>(var)); + m_context.addStateVariable(*std::get<0>(var), std::get<1>(var), std::get<2>(var)); } void ContractCompiler::registerImmutableVariables(ContractDefinition const& _contract) @@ -645,7 +644,7 @@ bool ContractCompiler::visit(FunctionDefinition const& _function) m_breakTags.clear(); m_continueTags.clear(); m_currentFunction = &_function; - m_modifierDepth = numeric_limits::max(); + m_modifierDepth = std::numeric_limits::max(); m_scopeStackHeight.clear(); m_context.setModifierDepth(0); @@ -662,10 +661,10 @@ bool ContractCompiler::visit(FunctionDefinition const& _function) unsigned const c_argumentsSize = CompilerUtils::sizeOnStack(_function.parameters()); unsigned const c_returnValuesSize = CompilerUtils::sizeOnStack(_function.returnParameters()); - vector stackLayout; + std::vector stackLayout; if (!_function.isConstructor() && !_function.isFallback()) stackLayout.push_back(static_cast(c_returnValuesSize)); // target of return address - stackLayout += vector(c_argumentsSize, -1); // discard all arguments + stackLayout += std::vector(c_argumentsSize, -1); // discard all arguments for (size_t i = 0; i < c_returnValuesSize; ++i) stackLayout.push_back(static_cast(i)); @@ -684,7 +683,7 @@ bool ContractCompiler::visit(FunctionDefinition const& _function) else { m_context << swapInstruction(static_cast(stackLayout.size()) - static_cast(stackLayout.back()) - 1u); - swap(stackLayout[static_cast(stackLayout.back())], stackLayout.back()); + std::swap(stackLayout[static_cast(stackLayout.back())], stackLayout.back()); } for (size_t i = 0; i < stackLayout.size(); ++i) if (stackLayout[i] != static_cast(i)) @@ -790,7 +789,7 @@ bool ContractCompiler::visit(InlineAssembly const& _inlineAssembly) unsigned stackDiff = static_cast(_assembly.stackHeight()) - m_context.baseStackOffsetOfVariable(*variable); if (!ref->second.suffix.empty()) { - string const& suffix = ref->second.suffix; + std::string const& suffix = ref->second.suffix; if (variable->type()->dataStoredIn(DataLocation::Storage)) { solAssert(suffix == "offset" || suffix == "slot", ""); @@ -865,7 +864,7 @@ bool ContractCompiler::visit(InlineAssembly const& _inlineAssembly) // lvalue context auto variable = dynamic_cast(decl); unsigned stackDiff = static_cast(_assembly.stackHeight()) - m_context.baseStackOffsetOfVariable(*variable) - 1; - string const& suffix = ref->second.suffix; + std::string const& suffix = ref->second.suffix; if (variable->type()->dataStoredIn(DataLocation::Storage)) { solAssert( @@ -928,7 +927,7 @@ bool ContractCompiler::visit(InlineAssembly const& _inlineAssembly) yul::AsmAnalysisInfo* analysisInfo = _inlineAssembly.annotation().analysisInfo.get(); // Only used in the scope below, but required to live outside to keep the - // shared_ptr's alive + // std::shared_ptr's alive yul::Object object = {}; // The optimiser cannot handle external references @@ -941,8 +940,8 @@ bool ContractCompiler::visit(InlineAssembly const& _inlineAssembly) solAssert(dialect, ""); // Create a modifiable copy of the code and analysis - object.code = make_shared(yul::ASTCopier().translate(*code)); - object.analysisInfo = make_shared(yul::AsmAnalyzer::analyzeStrictAssertCorrect(*dialect, object)); + object.code = std::make_shared(yul::ASTCopier().translate(*code)); + object.analysisInfo = std::make_shared(yul::AsmAnalyzer::analyzeStrictAssertCorrect(*dialect, object)); m_context.optimizeYul(object, *dialect, m_optimiserSettings); @@ -989,10 +988,10 @@ bool ContractCompiler::visit(TryStatement const& _tryStatement) TryCatchClause const& successClause = *_tryStatement.clauses().front(); if (successClause.parameters()) { - vector exprTypes{_tryStatement.externalCall().annotation().type}; + std::vector exprTypes{_tryStatement.externalCall().annotation().type}; if (auto tupleType = dynamic_cast(exprTypes.front())) exprTypes = tupleType->components(); - vector> const& params = successClause.parameters()->parameters(); + std::vector> const& params = successClause.parameters()->parameters(); solAssert(exprTypes.size() == params.size(), ""); for (size_t i = 0; i < exprTypes.size(); ++i) solAssert(params[i] && exprTypes[i] && *params[i]->annotation().type == *exprTypes[i], ""); @@ -1008,7 +1007,7 @@ bool ContractCompiler::visit(TryStatement const& _tryStatement) return false; } -void ContractCompiler::handleCatch(vector> const& _catchClauses) +void ContractCompiler::handleCatch(std::vector> const& _catchClauses) { // Stack is empty. ASTPointer error{}; @@ -1285,7 +1284,7 @@ bool ContractCompiler::visit(Return const& _return) if (Expression const* expression = _return.expression()) { solAssert(_return.annotation().functionReturnParameters, "Invalid return parameters pointer."); - vector> const& returnParameters = + std::vector> const& returnParameters = _return.annotation().functionReturnParameters->parameters(); TypePointers types; for (auto const& retVariable: returnParameters) @@ -1432,7 +1431,7 @@ void ContractCompiler::appendModifierOrFunctionCode() solAssert(m_currentFunction, ""); unsigned stackSurplus = 0; Block const* codeBlock = nullptr; - vector addedVariables; + std::vector addedVariables; m_modifierDepth++; m_context.setModifierDepth(m_modifierDepth); diff --git a/libsolidity/codegen/ExpressionCompiler.cpp b/libsolidity/codegen/ExpressionCompiler.cpp index fa94d2f58fa0..517f49c35331 100644 --- a/libsolidity/codegen/ExpressionCompiler.cpp +++ b/libsolidity/codegen/ExpressionCompiler.cpp @@ -43,7 +43,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; using namespace solidity::frontend; @@ -242,7 +241,7 @@ void ExpressionCompiler::appendStateVariableAccessor(VariableDeclaration const& if (auto arrayType = dynamic_cast(returnTypes[i])) if (!arrayType->isByteArrayOrString()) continue; - pair const& offsets = structType->storageOffsetsOfMember(names[i]); + std::pair const& offsets = structType->storageOffsetsOfMember(names[i]); m_context << Instruction::DUP1 << u256(offsets.first) << Instruction::ADD << u256(offsets.second); Type const* memberType = structType->memberType(names[i]); StorageItem(m_context, *memberType).retrieveValue(SourceLocation(), true); @@ -370,7 +369,7 @@ bool ExpressionCompiler::visit(TupleExpression const& _tuple) ArrayType const& arrayType = dynamic_cast(*_tuple.annotation().type); solAssert(!arrayType.isDynamicallySized(), "Cannot create dynamically sized inline array."); - utils().allocateMemory(max(u256(32u), arrayType.memoryDataSize())); + utils().allocateMemory(std::max(u256(32u), arrayType.memoryDataSize())); m_context << Instruction::DUP1; for (auto const& component: _tuple.components()) @@ -383,7 +382,7 @@ bool ExpressionCompiler::visit(TupleExpression const& _tuple) } else { - vector> lvalues; + std::vector> lvalues; for (auto const& component: _tuple.components()) if (component) { @@ -395,13 +394,13 @@ bool ExpressionCompiler::visit(TupleExpression const& _tuple) } } else if (_tuple.annotation().willBeWrittenTo) - lvalues.push_back(unique_ptr()); + lvalues.push_back(std::unique_ptr()); if (_tuple.annotation().willBeWrittenTo) { if (_tuple.components().size() == 1) m_currentLValue = std::move(lvalues[0]); else - m_currentLValue = make_unique(m_context, std::move(lvalues)); + m_currentLValue = std::make_unique(m_context, std::move(lvalues)); } } return false; @@ -524,7 +523,7 @@ bool ExpressionCompiler::visit(UnaryOperation const& _unaryOperation) m_context << u256(0) << Instruction::SUB; break; default: - solAssert(false, "Invalid unary operator: " + string(TokenTraits::toString(_unaryOperation.getOperator()))); + solAssert(false, "Invalid unary operator: " + std::string(TokenTraits::toString(_unaryOperation.getOperator()))); } return false; } @@ -659,14 +658,14 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) TypePointers parameterTypes = functionType->parameterTypes(); - vector> const& arguments = _functionCall.sortedArguments(); + std::vector> const& arguments = _functionCall.sortedArguments(); if (functionCallKind == FunctionCallKind::StructConstructorCall) { TypeType const& type = dynamic_cast(*_functionCall.expression().annotation().type); auto const& structType = dynamic_cast(*type.actualType()); - utils().allocateMemory(max(u256(32u), structType.memoryDataSize())); + utils().allocateMemory(std::max(u256(32u), structType.memoryDataSize())); m_context << Instruction::DUP1; for (unsigned i = 0; i < arguments.size(); ++i) @@ -992,7 +991,7 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) case FunctionType::Kind::Error: { _functionCall.expression().accept(*this); - vector argumentTypes; + std::vector argumentTypes; for (ASTPointer const& arg: _functionCall.sortedArguments()) { arg->accept(*this); @@ -1060,7 +1059,7 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) case FunctionType::Kind::RIPEMD160: { _functionCall.expression().accept(*this); - static map const contractAddresses{ + static std::map const contractAddresses{ {FunctionType::Kind::ECRecover, 1}, {FunctionType::Kind::SHA256, 2}, {FunctionType::Kind::RIPEMD160, 3} @@ -1151,8 +1150,8 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) case FunctionType::Kind::BytesConcat: { _functionCall.expression().accept(*this); - vector argumentTypes; - vector targetTypes; + std::vector argumentTypes; + std::vector targetTypes; for (auto const& argument: arguments) { argument->accept(*this); @@ -1416,7 +1415,7 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) // stack: // load current memory, mask and combine the selector - string mask = formatNumber((u256(-1) >> 32)); + std::string mask = formatNumber((u256(-1) >> 32)); m_context.appendInlineAssembly(R"({ let data_start := add(mem_ptr, 0x20) let data := mload(data_start) @@ -1476,7 +1475,7 @@ bool ExpressionCompiler::visit(FunctionCallOptions const& _functionCallOptions) // Desired Stack: [salt], [gas], [value] enum Option { Salt, Gas, Value }; - vector