{
  "address": "0xF7576237087F808eB39531cA490b4F8eFd4a0c69",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_roundId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_groupKey",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes[]",
          "name": "activeTssMembers",
          "type": "bytes[]"
        }
      ],
      "name": "tssActiveMemberAppended",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_roundId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_threshold",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes[]",
          "name": "_inActiveTssMembers",
          "type": "bytes[]"
        }
      ],
      "name": "tssGroupMemberAppend",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "getTssGroupInfo",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        },
        {
          "internalType": "bytes[]",
          "name": "",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTssGroupMembers",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTssGroupUnJailMembers",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTssInactiveGroupInfo",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes[]",
          "name": "",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_publicKey",
          "type": "bytes"
        }
      ],
      "name": "getTssMember",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "publicKey",
              "type": "bytes"
            },
            {
              "internalType": "address",
              "name": "nodeAddress",
              "type": "address"
            },
            {
              "internalType": "enum ITssGroupManager.MemberStatus",
              "name": "status",
              "type": "uint8"
            }
          ],
          "internalType": "struct ITssGroupManager.TssMember",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "inActiveIsEmpty",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "isInActiveMember",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_addr",
          "type": "address"
        }
      ],
      "name": "isTssGroupUnJailMembers",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_addr",
          "type": "address"
        }
      ],
      "name": "memberExistActive",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_publicKey",
          "type": "bytes"
        }
      ],
      "name": "memberExistActive",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_publicKey",
          "type": "bytes"
        }
      ],
      "name": "memberExistInActive",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_publicKey",
          "type": "bytes"
        }
      ],
      "name": "memberJail",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_publicKey",
          "type": "bytes"
        }
      ],
      "name": "memberUnJail",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_ethSignedMessageHash",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_sig",
          "type": "bytes"
        }
      ],
      "name": "recover",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_publicKey",
          "type": "bytes"
        }
      ],
      "name": "removeMember",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_publicKey",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "_groupPublicKey",
          "type": "bytes"
        }
      ],
      "name": "setGroupPublicKey",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_address",
          "type": "address"
        }
      ],
      "name": "setStakingSlash",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_threshold",
          "type": "uint256"
        },
        {
          "internalType": "bytes[]",
          "name": "_batchPublicKey",
          "type": "bytes[]"
        }
      ],
      "name": "setTssGroupMember",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stakingSlash",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "tssActiveMemberInfo",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "publicKey",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "nodeAddress",
          "type": "address"
        },
        {
          "internalType": "enum ITssGroupManager.MemberStatus",
          "name": "status",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_message",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_sig",
          "type": "bytes"
        }
      ],
      "name": "verifySign",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0x4236973a7ca6f1e4e636e1dc55cbdc3b738f2385610e99983357aca946a5b0e7",
  "receipt": {
    "to": null,
    "from": "0x2A2954F3989a83Cc43DD58B0f038D5F276f21333",
    "contractAddress": "0xF7576237087F808eB39531cA490b4F8eFd4a0c69",
    "transactionIndex": 20,
    "gasUsed": "2668789",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xb71629abc7921e98cd67b8ab397bee99e058cd52e73cb30c758f8575d47e1d0d",
    "transactionHash": "0x4236973a7ca6f1e4e636e1dc55cbdc3b738f2385610e99983357aca946a5b0e7",
    "logs": [
      {
        "transactionIndex": 20,
        "blockNumber": 17577837,
        "transactionHash": "0x4236973a7ca6f1e4e636e1dc55cbdc3b738f2385610e99983357aca946a5b0e7",
        "address": "0xF7576237087F808eB39531cA490b4F8eFd4a0c69",
        "topics": [
          "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"
        ],
        "data": "0x00000000000000000000000000000000000000000000000000000000000000ff",
        "logIndex": 86,
        "blockHash": "0xb71629abc7921e98cd67b8ab397bee99e058cd52e73cb30c758f8575d47e1d0d"
      }
    ],
    "blockNumber": 17577837,
    "cumulativeGasUsed": "4995729",
    "status": 1,
    "byzantium": true
  },
  "args": [],
  "numDeployments": 1,
  "solcInputHash": "ee1e34d4d1736701753c7ecc44ccb0d9",
  "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_roundId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_groupKey\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"activeTssMembers\",\"type\":\"bytes[]\"}],\"name\":\"tssActiveMemberAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_roundId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"_inActiveTssMembers\",\"type\":\"bytes[]\"}],\"name\":\"tssGroupMemberAppend\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"getTssGroupInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTssGroupMembers\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTssGroupUnJailMembers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTssInactiveGroupInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_publicKey\",\"type\":\"bytes\"}],\"name\":\"getTssMember\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"enum ITssGroupManager.MemberStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"internalType\":\"struct ITssGroupManager.TssMember\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inActiveIsEmpty\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"isInActiveMember\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"isTssGroupUnJailMembers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"memberExistActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_publicKey\",\"type\":\"bytes\"}],\"name\":\"memberExistActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_publicKey\",\"type\":\"bytes\"}],\"name\":\"memberExistInActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_publicKey\",\"type\":\"bytes\"}],\"name\":\"memberJail\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_publicKey\",\"type\":\"bytes\"}],\"name\":\"memberUnJail\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_ethSignedMessageHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_sig\",\"type\":\"bytes\"}],\"name\":\"recover\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_publicKey\",\"type\":\"bytes\"}],\"name\":\"removeMember\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_publicKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_groupPublicKey\",\"type\":\"bytes\"}],\"name\":\"setGroupPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setStakingSlash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"_batchPublicKey\",\"type\":\"bytes[]\"}],\"name\":\"setTssGroupMember\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakingSlash\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"tssActiveMemberInfo\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"enum ITssGroupManager.MemberStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_message\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_sig\",\"type\":\"bytes\"}],\"name\":\"verifySign\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/tss/TssGroupManager.sol\":\"TssGroupManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal onlyInitializing {\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal onlyInitializing {\\n        _transferOwnership(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        _checkOwner();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if the sender is not the owner.\\n     */\\n    function _checkOwner() internal view virtual {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n *     function initialize() initializer public {\\n *         __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n *     }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n *     function initializeV2() reinitializer(2) public {\\n *         __ERC20Permit_init(\\\"MyToken\\\");\\n *     }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n *     _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     * @custom:oz-retyped-from bool\\n     */\\n    uint8 private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Triggered when the contract has been initialized or reinitialized.\\n     */\\n    event Initialized(uint8 version);\\n\\n    /**\\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n     * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n     */\\n    modifier initializer() {\\n        bool isTopLevelCall = !_initializing;\\n        require(\\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n            \\\"Initializable: contract is already initialized\\\"\\n        );\\n        _initialized = 1;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n        }\\n        _;\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n            emit Initialized(1);\\n        }\\n    }\\n\\n    /**\\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n     * used to initialize parent contracts.\\n     *\\n     * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n     * initialization step. This is essential to configure modules that are added through upgrades and that require\\n     * initialization.\\n     *\\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n     * a contract, executing them in the right order is up to the developer or operator.\\n     */\\n    modifier reinitializer(uint8 version) {\\n        require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n        _initialized = version;\\n        _initializing = true;\\n        _;\\n        _initializing = false;\\n        emit Initialized(version);\\n    }\\n\\n    /**\\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n     */\\n    modifier onlyInitializing() {\\n        require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n     * through proxies.\\n     */\\n    function _disableInitializers() internal virtual {\\n        require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n        if (_initialized < type(uint8).max) {\\n            _initialized = type(uint8).max;\\n            emit Initialized(type(uint8).max);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal onlyInitializing {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal onlyInitializing {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n     *\\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n     * constructor.\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize/address.code.length, which returns 0\\n        // for contracts in construction, since the code is only stored at the end\\n        // of the constructor execution.\\n\\n        return account.code.length > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n                /// @solidity memory-safe-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal onlyInitializing {\\n    }\\n\\n    function __Context_init_unchained() internal onlyInitializing {\\n    }\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n    bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n    uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        // Inspired by OraclizeAPI's implementation - MIT licence\\n        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n        if (value == 0) {\\n            return \\\"0\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 digits;\\n        while (temp != 0) {\\n            digits++;\\n            temp /= 10;\\n        }\\n        bytes memory buffer = new bytes(digits);\\n        while (value != 0) {\\n            digits -= 1;\\n            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n            value /= 10;\\n        }\\n        return string(buffer);\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(uint256 value) internal pure returns (string memory) {\\n        if (value == 0) {\\n            return \\\"0x00\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 length = 0;\\n        while (temp != 0) {\\n            length++;\\n            temp >>= 8;\\n        }\\n        return toHexString(value, length);\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n     */\\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n        bytes memory buffer = new bytes(2 * length + 2);\\n        buffer[0] = \\\"0\\\";\\n        buffer[1] = \\\"x\\\";\\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\\n            buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n            value >>= 4;\\n        }\\n        require(value == 0, \\\"Strings: hex length insufficient\\\");\\n        return string(buffer);\\n    }\\n\\n    /**\\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(address addr) internal pure returns (string memory) {\\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n    }\\n}\\n\",\"keccak256\":\"0xea5339a7fff0ed42b45be56a88efdd0b2ddde9fa480dc99fef9a6a4c5b776863\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../StringsUpgradeable.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    enum RecoverError {\\n        NoError,\\n        InvalidSignature,\\n        InvalidSignatureLength,\\n        InvalidSignatureS,\\n        InvalidSignatureV\\n    }\\n\\n    function _throwError(RecoverError error) private pure {\\n        if (error == RecoverError.NoError) {\\n            return; // no error: do nothing\\n        } else if (error == RecoverError.InvalidSignature) {\\n            revert(\\\"ECDSA: invalid signature\\\");\\n        } else if (error == RecoverError.InvalidSignatureLength) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        } else if (error == RecoverError.InvalidSignatureS) {\\n            revert(\\\"ECDSA: invalid signature 's' value\\\");\\n        } else if (error == RecoverError.InvalidSignatureV) {\\n            revert(\\\"ECDSA: invalid signature 'v' value\\\");\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature` or error string. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     *\\n     * Documentation for signature generation:\\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n        // Check the signature length\\n        // - case 65: r,s,v signature (standard)\\n        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\\n        if (signature.length == 65) {\\n            bytes32 r;\\n            bytes32 s;\\n            uint8 v;\\n            // ecrecover takes the signature parameters, and the only way to get them\\n            // currently is to use assembly.\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                r := mload(add(signature, 0x20))\\n                s := mload(add(signature, 0x40))\\n                v := byte(0, mload(add(signature, 0x60)))\\n            }\\n            return tryRecover(hash, v, r, s);\\n        } else if (signature.length == 64) {\\n            bytes32 r;\\n            bytes32 vs;\\n            // ecrecover takes the signature parameters, and the only way to get them\\n            // currently is to use assembly.\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                r := mload(add(signature, 0x20))\\n                vs := mload(add(signature, 0x40))\\n            }\\n            return tryRecover(hash, r, vs);\\n        } else {\\n            return (address(0), RecoverError.InvalidSignatureLength);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, signature);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n     *\\n     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        bytes32 r,\\n        bytes32 vs\\n    ) internal pure returns (address, RecoverError) {\\n        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n        uint8 v = uint8((uint256(vs) >> 255) + 27);\\n        return tryRecover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n     *\\n     * _Available since v4.2._\\n     */\\n    function recover(\\n        bytes32 hash,\\n        bytes32 r,\\n        bytes32 vs\\n    ) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal pure returns (address, RecoverError) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n            return (address(0), RecoverError.InvalidSignatureS);\\n        }\\n        if (v != 27 && v != 28) {\\n            return (address(0), RecoverError.InvalidSignatureV);\\n        }\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        if (signer == address(0)) {\\n            return (address(0), RecoverError.InvalidSignature);\\n        }\\n\\n        return (signer, RecoverError.NoError);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(\\n        bytes32 hash,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * produces hash corresponding to the one signed with the\\n     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n     * JSON-RPC method as part of EIP-191.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from `s`. This\\n     * produces hash corresponding to the one signed with the\\n     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n     * JSON-RPC method as part of EIP-191.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", StringsUpgradeable.toString(s.length), s));\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Typed Data, created from a\\n     * `domainSeparator` and a `structHash`. This produces hash corresponding\\n     * to the one signed with the\\n     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n     * JSON-RPC method as part of EIP-712.\\n     *\\n     * See {recover}.\\n     */\\n    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n    }\\n}\\n\",\"keccak256\":\"0xe8c62ca00ed2d0a4d9b7e3c4bf7d62c821618b2cdb3c844da91a1193986851bf\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n// CAUTION\\n// This version of SafeMath should only be used with Solidity 0.8 or later,\\n// because it relies on the compiler's built in overflow checks.\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations.\\n *\\n * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler\\n * now has built in overflow checking.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            uint256 c = a + b;\\n            if (c < a) return (false, 0);\\n            return (true, c);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            if (b > a) return (false, 0);\\n            return (true, a - b);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n            // benefit is lost if 'b' is also tested.\\n            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n            if (a == 0) return (true, 0);\\n            uint256 c = a * b;\\n            if (c / a != b) return (false, 0);\\n            return (true, c);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            if (b == 0) return (false, 0);\\n            return (true, a / b);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            if (b == 0) return (false, 0);\\n            return (true, a % b);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a + b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a * b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(\\n        uint256 a,\\n        uint256 b,\\n        string memory errorMessage\\n    ) internal pure returns (uint256) {\\n        unchecked {\\n            require(b <= a, errorMessage);\\n            return a - b;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(\\n        uint256 a,\\n        uint256 b,\\n        string memory errorMessage\\n    ) internal pure returns (uint256) {\\n        unchecked {\\n            require(b > 0, errorMessage);\\n            return a / b;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(\\n        uint256 a,\\n        uint256 b,\\n        string memory errorMessage\\n    ) internal pure returns (uint256) {\\n        unchecked {\\n            require(b > 0, errorMessage);\\n            return a % b;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcaa8b7861115ea691c77ddbeac140a444e0edcd1d9812a43942c0f6b42b36a49\",\"license\":\"MIT\"},\"contracts/L1/tss/ITssGroupManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\ninterface ITssGroupManager {\\n    enum MemberStatus {\\n        unJail,\\n        jail\\n    }\\n\\n    struct TssMember {\\n        bytes         publicKey;\\n        address       nodeAddress;\\n        MemberStatus  status;\\n    }\\n\\n    function setTssGroupMember(uint256 _threshold, bytes[] memory _batchPublicKey) external;\\n    function setGroupPublicKey(bytes memory _publicKey, bytes memory _groupPublicKey) external;\\n    function getTssGroupInfo() external returns (uint256, uint256, bytes memory, bytes[] memory);\\n    function getTssInactiveGroupInfo() external returns (uint256, uint256, bytes[] memory);\\n    function memberJail(bytes memory _publicKey) external;\\n    function memberUnJail(bytes memory _publicKey) external;\\n    function removeMember(bytes memory _publicKey) external;\\n    function getTssGroupUnJailMembers() external returns (address[] memory);\\n    function getTssGroupMembers() external returns (bytes[] memory);\\n    function getTssMember(bytes memory _publicKey) external returns (TssMember memory);\\n    function memberExistActive(bytes memory _publicKey) external returns (bool);\\n    function memberExistInActive(bytes memory _publicKey) external returns (bool);\\n    function inActiveIsEmpty() external returns (bool);\\n    function verifySign(bytes32 _message, bytes memory _sig) external returns (bool);\\n    function isTssGroupUnJailMembers(address _addr) external returns (bool);\\n    function memberExistActive(address _addr) external returns (bool);\\n}\\n\",\"keccak256\":\"0xb5ba6959a8081f00f8f8322d6b3cdab4f7a92e86df4a035ad1485caaf98e6558\",\"license\":\"MIT\"},\"contracts/L1/tss/ITssStakingSlashing.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\ninterface IStakingSlashing {\\n\\n    // tx\\n    function setTokenAddress(address) external;\\n    function setTssGroupAddress(address) external;\\n    function setRegulatoryAccount(address) external;\\n    function setClaimer(address, address) external;\\n    function setSlashingParams(uint256[2] calldata) external;\\n    function setTssManager(address) external;\\n    function quitRequest() external;\\n    function clearQuitRequestList() external;\\n    function slashing(bytes calldata, bytes calldata) external;\\n    function unJail() external;\\n\\n    // query\\n    function getSlashingParams() external view returns (uint256[2] memory);\\n    function getQuitRequestList() external view returns (address[] memory);\\n    function getSlashRecord(uint256, address) external view returns (bool);\\n    function isJailed(address) external returns (bool);\\n    function isCanOperator(address) external returns (bool);\\n\\n    //fund\\n    function deposit(uint256 amount) external returns (uint256);\\n    function withdraw() external;\\n    function completeWithdraw() external;\\n    function startWithdraw() external;\\n    function canCompleteQueuedWithdrawal() external returns (bool);\\n\\n    //delegation\\n    function registerAsOperator(bytes calldata) external;\\n    function delegateTo(address) external;\\n\\n\\n\\n\\n}\\n\",\"keccak256\":\"0x276ca6a8e7447d3519d57ee6cbc38eca7230ba99b6429fa7253b9f90da016be8\",\"license\":\"MIT\"},\"contracts/L1/tss/TssGroupManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\nimport {Lib_Address} from \\\"../../libraries/utils/Lib_Address.sol\\\";\\nimport \\\"./ITssGroupManager.sol\\\";\\nimport \\\"./ITssStakingSlashing.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\n\\ncontract TssGroupManager is\\n    Initializable,\\n    OwnableUpgradeable,\\n    ReentrancyGuardUpgradeable,\\n    ITssGroupManager\\n{\\n    using SafeMathUpgradeable for uint256;\\n    using ECDSAUpgradeable for bytes32;\\n    using AddressUpgradeable for address;\\n    bytes confirmGroupPublicKey;\\n    address confirmGroupAddress;\\n    uint256 threshold;\\n    uint256 gRoundId;\\n    uint256 tempThreshold;\\n    address public stakingSlash;\\n\\n    bytes[] activeTssMembers; // active tss member group\\n    bytes[] inActiveTssMembers; // inactive tss member group\\n    mapping(bytes => TssMember) public tssActiveMemberInfo; // Tss member publicKey => tssMember\\n    mapping(bytes => bytes) private _memberGroupKey; // user publicKey => Cpk\\n    mapping(bytes => uint256) private _groupKeyCounter; // Cpk counter\\n    mapping(bytes => bool) private _isSubmitGroupKey; // submit group key or not\\n    mapping(bytes => bool) public isInActiveMember; // tss member exist or not\\n\\n    event tssGroupMemberAppend(uint256 _roundId, uint256 _threshold, bytes[] _inActiveTssMembers);\\n\\n    event tssActiveMemberAppended(uint256 _roundId, bytes _groupKey, bytes[] activeTssMembers);\\n\\n    constructor() {\\n        _disableInitializers();\\n    }\\n\\n    function initialize() public initializer {\\n        __Ownable_init();\\n        gRoundId = 0;\\n        threshold = 0;\\n        tempThreshold = 0;\\n    }\\n\\n    modifier onlyStakingSlash() {\\n        require(msg.sender == stakingSlash, \\\"contract call is not staking slashing\\\");\\n        _;\\n    }\\n\\n    function setStakingSlash(address _address) public onlyOwner {\\n        require(_address != address(0), \\\"param _address is the zero address\\\");\\n        stakingSlash = _address;\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function setTssGroupMember(uint256 _threshold, bytes[] calldata _batchPublicKey)\\n        public\\n        override\\n        onlyOwner\\n    {\\n        require((_batchPublicKey.length > 0), \\\"batch public key is empty\\\");\\n        require(_threshold < _batchPublicKey.length, \\\"threshold must less than tss member\\\");\\n        for (uint256 i = 0; i < _batchPublicKey.length; i++) {\\n            address operator = Lib_Address.publicKeyToAddress(_batchPublicKey[i]);\\n            require(IStakingSlashing(stakingSlash).isCanOperator(operator),\\\"batch public keys has a node ,can not be operator\\\");\\n        }\\n\\n        if(inActiveTssMembers.length > 0) {\\n            for (uint256 i = 0; i < inActiveTssMembers.length; i++) {\\n                // re-election clear data\\n                delete _groupKeyCounter[_memberGroupKey[inActiveTssMembers[i]]];\\n                delete _memberGroupKey[inActiveTssMembers[i]];\\n                delete _isSubmitGroupKey[inActiveTssMembers[i]];\\n                delete isInActiveMember[inActiveTssMembers[i]];\\n            }\\n            delete inActiveTssMembers;\\n        }\\n        for (uint256 i = 0; i < _batchPublicKey.length; i++) {\\n            inActiveTssMembers.push(_batchPublicKey[i]);\\n            isInActiveMember[_batchPublicKey[i]] = true;\\n            _isSubmitGroupKey[_batchPublicKey[i]] = false;\\n        }\\n        tempThreshold = _threshold;\\n        emit tssGroupMemberAppend(gRoundId + 1, _threshold, _batchPublicKey);\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function setGroupPublicKey(bytes calldata _publicKey, bytes calldata _groupPublicKey)\\n        public\\n        override\\n    {\\n        require(isInActiveMember[_publicKey], \\\"your public key is not in InActiveMember\\\");\\n        require(msg.sender == Lib_Address.publicKeyToAddress(_publicKey), \\\"public key not match\\\");\\n        require(_groupPublicKey.length == 64, \\\"Invalid groupPublicKey length\\\");\\n\\n        if (!_isSubmitGroupKey[_publicKey]) {\\n            _isSubmitGroupKey[_publicKey] = true;\\n        }\\n        if (!_isEqual(_memberGroupKey[_publicKey], _groupPublicKey)) {\\n            _groupKeyCounter[_groupPublicKey] += 1;\\n            if (_memberGroupKey[_publicKey].length != 0) {\\n                _groupKeyCounter[_memberGroupKey[_publicKey]] -= 1;\\n            }\\n            _memberGroupKey[_publicKey] = _groupPublicKey;\\n        }\\n        if (_groupKeyCounter[_groupPublicKey] >= inActiveTssMembers.length) {\\n            _updateTssMember(_groupPublicKey);\\n        }\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function getTssGroupInfo()\\n        public\\n        view\\n        override\\n        returns (\\n            uint256,\\n            uint256,\\n            bytes memory,\\n            bytes[] memory\\n        )\\n    {\\n        return (gRoundId, threshold, confirmGroupPublicKey, activeTssMembers);\\n    }\\n\\n    /**\\n    * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function getTssInactiveGroupInfo() public view override returns (uint256, uint256,  bytes[] memory){\\n        return (gRoundId + 1, tempThreshold, inActiveTssMembers);\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function memberJail(bytes calldata _publicKey) public override onlyStakingSlash {\\n        tssActiveMemberInfo[_publicKey].status = MemberStatus.jail;\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function memberUnJail(bytes calldata _publicKey) public override onlyStakingSlash {\\n        tssActiveMemberInfo[_publicKey].status = MemberStatus.unJail;\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function removeMember(bytes calldata _publicKey) public override onlyOwner {\\n        require(\\n            activeTssMembers.length > threshold + 1,\\n            \\\"TssGroupManager removeMember: active members must more than threshold plus one\\\"\\n        );\\n        for (uint256 i = 0; i < activeTssMembers.length; i++) {\\n            if (_isEqual(activeTssMembers[i], _publicKey)) {\\n                _removeActiveTssMembers(i);\\n                break;\\n            }\\n        }\\n        delete tssActiveMemberInfo[_publicKey];\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function getTssGroupUnJailMembers() public view override returns (address[] memory) {\\n        uint256 expectedLength;\\n        for (uint256 i = 0; i < activeTssMembers.length; i++) {\\n            if (tssActiveMemberInfo[activeTssMembers[i]].status == MemberStatus.unJail) {\\n                expectedLength++;\\n            }\\n        }\\n        address[] memory _addresses = new address[](expectedLength);\\n        uint256 index;\\n        for (uint256 i = 0; i < activeTssMembers.length; i++) {\\n            if (tssActiveMemberInfo[activeTssMembers[i]].status == MemberStatus.unJail) {\\n                _addresses[index] = tssActiveMemberInfo[activeTssMembers[i]].nodeAddress;\\n                index++;\\n            }\\n        }\\n        return _addresses;\\n    }\\n\\n    function isTssGroupUnJailMembers(address _addr) public view override returns (bool) {\\n        for (uint256 i = 0; i < activeTssMembers.length; i++) {\\n            if (tssActiveMemberInfo[activeTssMembers[i]].status == MemberStatus.unJail) {\\n                if ( _addr == tssActiveMemberInfo[activeTssMembers[i]].nodeAddress) {\\n                    return true;\\n                }\\n            }\\n        }\\n        return false;\\n    }\\n\\n    function memberExistActive(address _addr) public view override returns (bool) {\\n        for (uint256 i = 0; i < activeTssMembers.length; i++) {\\n            if ( _addr == tssActiveMemberInfo[activeTssMembers[i]].nodeAddress) {\\n                return true;\\n            }\\n        }\\n        return false;\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function getTssGroupMembers() public view override returns (bytes[] memory) {\\n        return activeTssMembers;\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function getTssMember(bytes calldata _publicKey) public view override returns (TssMember memory) {\\n        return tssActiveMemberInfo[_publicKey];\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function memberExistActive(bytes calldata _publicKey) public view override returns (bool) {\\n        if (tssActiveMemberInfo[_publicKey].publicKey.length > 0) {\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function memberExistInActive(bytes calldata _publicKey) public view override returns (bool) {\\n        return isInActiveMember[_publicKey];\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function inActiveIsEmpty() public view override returns (bool) {\\n        return inActiveTssMembers.length == 0;\\n    }\\n\\n    /**\\n     * @inheritdoc ITssGroupManager\\n     */\\n    // slither-disable-next-line external-function\\n    function verifySign(bytes32 _message, bytes calldata _sig) public view override returns (bool) {\\n        return (recover(_message, _sig) == confirmGroupAddress);\\n    }\\n\\n    function _updateTssMember(bytes calldata _groupPublicKey) private {\\n        if (activeTssMembers.length > 0) {\\n            for (uint256 i = 0; i < activeTssMembers.length; i++) {\\n                delete tssActiveMemberInfo[activeTssMembers[i]];    // delete tss active member map\\n            }\\n            delete activeTssMembers;  // delete active members\\n        }\\n        for (uint256 i = 0; i < inActiveTssMembers.length; i++) {\\n            activeTssMembers.push(inActiveTssMembers[i]);\\n            tssActiveMemberInfo[inActiveTssMembers[i]] = TssMember({\\n                publicKey: inActiveTssMembers[i],\\n                nodeAddress: Lib_Address.publicKeyToAddress(inActiveTssMembers[i]),\\n                status: MemberStatus.unJail\\n            });\\n            // election finish clear InActiveMember data\\n            delete _groupKeyCounter[_memberGroupKey[inActiveTssMembers[i]]];\\n            delete _memberGroupKey[inActiveTssMembers[i]];\\n            delete _isSubmitGroupKey[inActiveTssMembers[i]];\\n            delete isInActiveMember[inActiveTssMembers[i]];\\n        }\\n        delete inActiveTssMembers;\\n        confirmGroupPublicKey = _groupPublicKey;\\n        confirmGroupAddress = Lib_Address.publicKeyToAddress(_groupPublicKey);\\n        threshold = tempThreshold;\\n        gRoundId = gRoundId + 1;\\n        emit tssActiveMemberAppended(gRoundId, _groupPublicKey, activeTssMembers);\\n    }\\n\\n    function recover(bytes32 _ethSignedMessageHash, bytes calldata _sig)\\n        public\\n        pure\\n        returns (address)\\n    {\\n        (bytes32 r, bytes32 s, uint8 v) = _split(_sig);\\n        address signer = ecrecover(_ethSignedMessageHash, v, r, s);\\n        require(signer != address(0), \\\"ecrecover failed\\\");\\n        return signer;\\n    }\\n\\n    function _split(bytes memory _sig)\\n        internal\\n        pure\\n        returns (\\n            bytes32 r,\\n            bytes32 s,\\n            uint8 v\\n        )\\n    {\\n        require(_sig.length == 65, \\\"invalid signature length\\\");\\n        assembly {\\n            r := mload(add(_sig, 32))\\n            s := mload(add(_sig, 64))\\n            v := byte(0, mload(add(_sig, 96)))\\n        }\\n        if (v < 27) v += 27;\\n    }\\n\\n    function _isEqual(bytes memory byteListA, bytes memory byteListB) private pure returns (bool) {\\n        if (byteListA.length != byteListB.length) return false;\\n        for (uint256 i = 0; i < byteListA.length; i++) {\\n            if (byteListA[i] != byteListB[i]) return false;\\n        }\\n        return true;\\n    }\\n\\n    function _removeActiveTssMembers(uint256 _index) private {\\n        activeTssMembers[_index] = activeTssMembers[activeTssMembers.length - 1];\\n        activeTssMembers.pop();\\n    }\\n}\\n\",\"keccak256\":\"0x372046061902e85b9233088ac77742594745ba94958fcdd7712aae46be340c0f\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Address\\n * @dev This library for convert bytes publicKey to address\\n */\\nlibrary Lib_Address {\\n\\n    function publicKeyToAddress(bytes memory publicKey) internal pure returns (address) {\\n        require(publicKey.length == 64, \\\"public key length must 64 bytes\\\");\\n        return address(uint160(uint256(keccak256(publicKey))));\\n    }\\n}\\n\",\"keccak256\":\"0xd63754b828cd2f38da4ad7fc9d0d0f9aee1f85c1599346bbebf69242338c65bc\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x60806040523480156200001157600080fd5b506200001c62000022565b620000e4565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b612ed280620000f46000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80637a952c11116100de578063b57388d311610097578063e46a636811610071578063e46a636814610338578063f2fde38b14610366578063fcca559214610379578063fd3eb81f1461039157600080fd5b8063b57388d3146102ff578063bcbc5fc614610312578063cf4c8a7b1461032557600080fd5b80637a952c11146102935780638129fc1c146102a65780638a51d8b4146102ae5780638da5cb5b146102b757806395f645bc146102c8578063b3bd9ac4146102dd57600080fd5b8063429ec49c11610130578063429ec49c1461021f5780634679b366146102325780634866e2e01461024557806354bbb9141461025857806368fe7d2314610278578063715018a61461028b57600080fd5b806319045a25146101785780631a47931b146101a8578063254ff981146101bd5780632cd00d53146101d05780633231a7f0146101e5578063404a698614610208575b600080fd5b61018b6101863660046125f1565b6103a4565b6040516001600160a01b0390911681526020015b60405180910390f35b6101bb6101b636600461263d565b6104b5565b005b6101bb6101cb3660046126bc565b61098d565b6101d8610a06565b60405161019f91906126fe565b6101f86101f33660046125f1565b610bf4565b604051901515815260200161019f565b610210610c20565b60405161019f939291906127f0565b6101bb61022d3660046126bc565b610d17565b6101bb610240366004612818565b610d55565b6101f86102533660046126bc565b61112b565b61026b6102663660046126bc565b61115b565b60405161019f91906128bc565b6101f8610286366004612906565b611288565b6101bb611370565b6101bb6102a13660046126bc565b611384565b6101bb611582565b609e54156101f8565b6033546001600160a01b031661018b565b6102d06116a2565b60405161019f9190612936565b6102f06102eb36600461295f565b61177b565b60405161019f93929190612a10565b6101f861030d366004612906565b611840565b6101f86103203660046126bc565b6118bb565b609c5461018b906001600160a01b031681565b6101f861034636600461295f565b805160208183018101805160a38252928201919093012091525460ff1681565b6101bb610374366004612906565b611902565b610381611978565b60405161019f9493929190612a49565b6101bb61039f366004612906565b611af5565b6000806000806103e986868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8092505050565b92509250925060006001888386866040516000815260200160405260405161042d949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561044f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166104aa5760405162461bcd60e51b815260206004820152601060248201526f1958dc9958dbdd995c8819985a5b195960821b60448201526064015b60405180910390fd5b979650505050505050565b6104bd611c09565b8061050a5760405162461bcd60e51b815260206004820152601960248201527f6261746368207075626c6963206b657920697320656d7074790000000000000060448201526064016104a1565b8083106105655760405162461bcd60e51b815260206004820152602360248201527f7468726573686f6c64206d757374206c657373207468616e20747373206d656d6044820152623132b960e91b60648201526084016104a1565b60005b818110156106cd5760006105d384848481811061058757610587612a7a565b90506020028101906105999190612a90565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6392505050565b609c5460405163522c209d60e11b81526001600160a01b03808416600483015292935091169063a458413a90602401602060405180830381600087803b15801561061c57600080fd5b505af1158015610630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106549190612ad7565b6106ba5760405162461bcd60e51b815260206004820152603160248201527f6261746368207075626c6963206b657973206861732061206e6f6465202c636160448201527037103737ba1031329037b832b930ba37b960791b60648201526084016104a1565b50806106c581612b0f565b915050610568565b50609e54156108295760005b609e5481101561081c5760a160a0609e83815481106106fa576106fa612a7a565b906000526020600020016040516107119190612b65565b90815260405190819003602001812061072991612b65565b90815260200160405180910390206000905560a0609e828154811061075057610750612a7a565b906000526020600020016040516107679190612b65565b9081526020016040518091039020600061078191906123ab565b60a2609e828154811061079657610796612a7a565b906000526020600020016040516107ad9190612b65565b908152604051908190036020019020805460ff19169055609e805460a39190839081106107dc576107dc612a7a565b906000526020600020016040516107f39190612b65565b908152604051908190036020019020805460ff191690558061081481612b0f565b9150506106d9565b50610829609e60006123e5565b60005b8181101561093757609e83838381811061084857610848612a7a565b905060200281019061085a9190612a90565b82546001810184556000938452602090932061087893019190612403565b50600160a384848481811061088f5761088f612a7a565b90506020028101906108a19190612a90565b6040516108af929190612bd7565b908152604051908190036020019020805491151560ff19909216919091179055600060a28484848181106108e5576108e5612a7a565b90506020028101906108f79190612a90565b604051610905929190612bd7565b908152604051908190036020019020805491151560ff199092169190911790558061092f81612b0f565b91505061082c565b50609b839055609a547ffa26843b7ced045dd12994ee0e73c6f0904c3a4608bce58ae304d606035b079e9061096d906001612be7565b8484846040516109809493929190612c28565b60405180910390a1505050565b609c546001600160a01b031633146109b75760405162461bcd60e51b81526004016104a190612cd6565b6001609f83836040516109cb929190612bd7565b908152602001604051809103902060010160146101000a81548160ff021916908360018111156109fd576109fd612884565b02179055505050565b60606000805b609d54811015610a9a576000609f609d8381548110610a2d57610a2d612a7a565b90600052602060002001604051610a449190612b65565b908152602001604051809103902060010160149054906101000a900460ff166001811115610a7457610a74612884565b1415610a885781610a8481612b0f565b9250505b80610a9281612b0f565b915050610a0c565b5060008167ffffffffffffffff811115610ab657610ab6612949565b604051908082528060200260200182016040528015610adf578160200160208202803683370190505b5090506000805b609d54811015610beb576000609f609d8381548110610b0757610b07612a7a565b90600052602060002001604051610b1e9190612b65565b908152602001604051809103902060010160149054906101000a900460ff166001811115610b4e57610b4e612884565b1415610bd957609f609d8281548110610b6957610b69612a7a565b90600052602060002001604051610b809190612b65565b9081526040519081900360200190206001015483516001600160a01b0390911690849084908110610bb357610bb3612a7a565b6001600160a01b039092166020928302919091019091015281610bd581612b0f565b9250505b80610be381612b0f565b915050610ae6565b50909392505050565b6098546000906001600160a01b0316610c0e8585856103a4565b6001600160a01b031614949350505050565b6000806060609a546001610c349190612be7565b609b54609e80805480602002602001604051908101604052809291908181526020016000905b82821015610d06578382906000526020600020018054610c7990612b2a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca590612b2a565b8015610cf25780601f10610cc757610100808354040283529160200191610cf2565b820191906000526020600020905b815481529060010190602001808311610cd557829003601f168201915b505050505081526020019060010190610c5a565b505050509050925092509250909192565b609c546001600160a01b03163314610d415760405162461bcd60e51b81526004016104a190612cd6565b6000609f83836040516109cb929190612bd7565b60a38484604051610d67929190612bd7565b9081526040519081900360200190205460ff16610dd75760405162461bcd60e51b815260206004820152602860248201527f796f7572207075626c6963206b6579206973206e6f7420696e20496e416374696044820152673b32a6b2b6b132b960c11b60648201526084016104a1565b610e1684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6392505050565b6001600160a01b0316336001600160a01b031614610e6d5760405162461bcd60e51b81526020600482015260146024820152730e0eac4d8d2c640d6caf240dcdee840dac2e8c6d60631b60448201526064016104a1565b60408114610ebd5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642067726f75705075626c69634b6579206c656e67746800000060448201526064016104a1565b60a28484604051610ecf929190612bd7565b9081526040519081900360200190205460ff16610f1b57600160a28585604051610efa929190612bd7565b908152604051908190036020019020805491151560ff199092169190911790555b61100360a08585604051610f30929190612bd7565b90815260200160405180910390208054610f4990612b2a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7590612b2a565b8015610fc25780601f10610f9757610100808354040283529160200191610fc2565b820191906000526020600020905b815481529060010190602001808311610fa557829003601f168201915b505050505083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cc292505050565b6110f157600160a1838360405161101b929190612bd7565b908152602001604051809103902060008282546110389190612be7565b909155505060405160a0906110509086908690612bd7565b9081526020016040518091039020805461106990612b2a565b1590506110c157600160a160a08686604051611086929190612bd7565b90815260405190819003602001812061109e91612b65565b908152602001604051809103902060008282546110bb9190612d1b565b90915550505b818160a086866040516110d5929190612bd7565b9081526040519081900360200190206110ef929091612403565b505b609e5460405160a1906111079085908590612bd7565b90815260200160405180910390205410611125576111258282611d54565b50505050565b600060a3838360405161113f929190612bd7565b9081526040519081900360200190205460ff1690505b92915050565b61117c60408051606080820183528152600060208201819052909182015290565b609f838360405161118e929190612bd7565b90815260200160405180910390206040518060600160405290816000820180546111b790612b2a565b80601f01602080910402602001604051908101604052809291908181526020018280546111e390612b2a565b80156112305780601f1061120557610100808354040283529160200191611230565b820191906000526020600020905b81548152906001019060200180831161121357829003601f168201915b50505091835250506001828101546001600160a01b0381166020840152604090920191600160a01b900460ff169081111561126d5761126d612884565b600181111561127e5761127e612884565b9052509392505050565b6000805b609d54811015611367576000609f609d83815481106112ad576112ad612a7a565b906000526020600020016040516112c49190612b65565b908152602001604051809103902060010160149054906101000a900460ff1660018111156112f4576112f4612884565b141561135557609f609d828154811061130f5761130f612a7a565b906000526020600020016040516113269190612b65565b908152604051908190036020019020600101546001600160a01b03848116911614156113555750600192915050565b8061135f81612b0f565b91505061128c565b50600092915050565b611378611c09565b611382600061226e565b565b61138c611c09565b60995461139a906001612be7565b609d54116114275760405162461bcd60e51b815260206004820152604e60248201527f54737347726f75704d616e616765722072656d6f76654d656d6265723a20616360448201527f74697665206d656d62657273206d757374206d6f7265207468616e207468726560648201526d73686f6c6420706c7573206f6e6560901b608482015260a4016104a1565b60005b609d5481101561153e57611519609d828154811061144a5761144a612a7a565b90600052602060002001805461145f90612b2a565b80601f016020809104026020016040519081016040528092919081815260200182805461148b90612b2a565b80156114d85780601f106114ad576101008083540402835291602001916114d8565b820191906000526020600020905b8154815290600101906020018083116114bb57829003601f168201915b505050505084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cc292505050565b1561152c57611527816122c0565b61153e565b8061153681612b0f565b91505061142a565b50609f8282604051611551929190612bd7565b908152604051908190036020019020600061156c82826123ab565b5060010180546001600160a81b03191690555050565b600054610100900460ff16158080156115a25750600054600160ff909116105b806115bc5750303b1580156115bc575060005460ff166001145b61161f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a1565b6000805460ff191660011790558015611642576000805461ff0019166101001790555b61164a612351565b6000609a8190556099819055609b55801561169f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6060609d805480602002602001604051908101604052809291908181526020016000905b828210156117725783829060005260206000200180546116e590612b2a565b80601f016020809104026020016040519081016040528092919081815260200182805461171190612b2a565b801561175e5780601f106117335761010080835404028352916020019161175e565b820191906000526020600020905b81548152906001019060200180831161174157829003601f168201915b5050505050815260200190600101906116c6565b50505050905090565b8051602081830181018051609f825292820191909301209152805481906117a190612b2a565b80601f01602080910402602001604051908101604052809291908181526020018280546117cd90612b2a565b801561181a5780601f106117ef5761010080835404028352916020019161181a565b820191906000526020600020905b8154815290600101906020018083116117fd57829003601f168201915b505050600190930154919250506001600160a01b0381169060ff600160a01b9091041683565b6000805b609d5481101561136757609f609d828154811061186357611863612a7a565b9060005260206000200160405161187a9190612b65565b908152604051908190036020019020600101546001600160a01b03848116911614156118a95750600192915050565b806118b381612b0f565b915050611844565b600080609f84846040516118d0929190612bd7565b90815260405190819003602001902080546118ea90612b2a565b905011156118fa57506001611155565b506000611155565b61190a611c09565b6001600160a01b03811661196f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104a1565b61169f8161226e565b600080606080609a546099546097609d81805461199490612b2a565b80601f01602080910402602001604051908101604052809291908181526020018280546119c090612b2a565b8015611a0d5780601f106119e257610100808354040283529160200191611a0d565b820191906000526020600020905b8154815290600101906020018083116119f057829003601f168201915b5050505050915080805480602002602001604051908101604052809291908181526020016000905b82821015611ae1578382906000526020600020018054611a5490612b2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8090612b2a565b8015611acd5780601f10611aa257610100808354040283529160200191611acd565b820191906000526020600020905b815481529060010190602001808311611ab057829003601f168201915b505050505081526020019060010190611a35565b505050509050935093509350935090919293565b611afd611c09565b6001600160a01b038116611b5e5760405162461bcd60e51b815260206004820152602260248201527f706172616d205f6164647265737320697320746865207a65726f206164647265604482015261737360f01b60648201526084016104a1565b609c80546001600160a01b0319166001600160a01b0392909216919091179055565b60008060008351604114611bd65760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016104a1565b50505060208101516040820151606083015160001a601b811015611c0257611bff601b82612d32565b90505b9193909250565b6033546001600160a01b031633146113825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a1565b60008151604014611cb65760405162461bcd60e51b815260206004820152601f60248201527f7075626c6963206b6579206c656e677468206d7573742036342062797465730060448201526064016104a1565b50805160209091012090565b60008151835114611cd557506000611155565b60005b8351811015611d4a57828181518110611cf357611cf3612a7a565b602001015160f81c60f81b6001600160f81b031916848281518110611d1a57611d1a612a7a565b01602001516001600160f81b03191614611d38576000915050611155565b80611d4281612b0f565b915050611cd8565b5060019392505050565b609d5415611de15760005b609d54811015611dd457609f609d8281548110611d7e57611d7e612a7a565b90600052602060002001604051611d959190612b65565b9081526040519081900360200190206000611db082826123ab565b5060010180546001600160a81b031916905580611dcc81612b0f565b915050611d5f565b50611de1609d60006123e5565b60005b609e5481101561219b57609d609e8281548110611e0357611e03612a7a565b600091825260208083208454600181018655948452922091018054919092019190611e2d90612b2a565b611e38929190612487565b506040518060600160405280609e8381548110611e5757611e57612a7a565b906000526020600020018054611e6c90612b2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9890612b2a565b8015611ee55780601f10611eba57610100808354040283529160200191611ee5565b820191906000526020600020905b815481529060010190602001808311611ec857829003601f168201915b50505050508152602001611f9d609e8481548110611f0557611f05612a7a565b906000526020600020018054611f1a90612b2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4690612b2a565b8015611f935780601f10611f6857610100808354040283529160200191611f93565b820191906000526020600020905b815481529060010190602001808311611f7657829003601f168201915b5050505050611c63565b6001600160a01b031681526020016000815250609f609e8381548110611fc557611fc5612a7a565b90600052602060002001604051611fdc9190612b65565b90815260200160405180910390206000820151816000019080519060200190612006929190612502565b506020820151600180830180546001600160a01b039093166001600160a01b031984168117825560408601519391926001600160a81b03199092161790600160a01b90849081111561205a5761205a612884565b021790555090505060a160a0609e838154811061207957612079612a7a565b906000526020600020016040516120909190612b65565b9081526040519081900360200181206120a891612b65565b90815260200160405180910390206000905560a0609e82815481106120cf576120cf612a7a565b906000526020600020016040516120e69190612b65565b9081526020016040518091039020600061210091906123ab565b60a2609e828154811061211557612115612a7a565b9060005260206000200160405161212c9190612b65565b908152604051908190036020019020805460ff19169055609e805460a391908390811061215b5761215b612a7a565b906000526020600020016040516121729190612b65565b908152604051908190036020019020805460ff191690558061219381612b0f565b915050611de4565b506121a8609e60006123e5565b6121b460978383612403565b506121f482828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6392505050565b609880546001600160a01b0319166001600160a01b0392909216919091179055609b54609955609a54612228906001612be7565b609a8190556040517f61c7922e50ad7ea3d35879a4a819ae97eb09b665f2113451d7ada7cb2b689b66916122629185908590609d90612d57565b60405180910390a15050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b609d80546122d090600190612d1b565b815481106122e0576122e0612a7a565b90600052602060002001609d82815481106122fd576122fd612a7a565b9060005260206000200190805461231390612b2a565b61231e929190612487565b50609d80548061233057612330612e3b565b60019003818190600052602060002001600061234c91906123ab565b905550565b600054610100900460ff166123785760405162461bcd60e51b81526004016104a190612e51565b611382600054610100900460ff166123a25760405162461bcd60e51b81526004016104a190612e51565b6113823361226e565b5080546123b790612b2a565b6000825580601f106123c7575050565b601f01602090049060005260206000209081019061169f9190612576565b508054600082559060005260206000209081019061169f919061258b565b82805461240f90612b2a565b90600052602060002090601f0160209004810192826124315760008555612477565b82601f1061244a5782800160ff19823516178555612477565b82800160010185558215612477579182015b8281111561247757823582559160200191906001019061245c565b50612483929150612576565b5090565b82805461249390612b2a565b90600052602060002090601f0160209004810192826124b55760008555612477565b82601f106124c65780548555612477565b8280016001018555821561247757600052602060002091601f016020900482015b828111156124775782548255916001019190600101906124e7565b82805461250e90612b2a565b90600052602060002090601f0160209004810192826125305760008555612477565b82601f1061254957805160ff1916838001178555612477565b82800160010185558215612477579182015b8281111561247757825182559160200191906001019061255b565b5b808211156124835760008155600101612577565b8082111561248357600061259f82826123ab565b5060010161258b565b60008083601f8401126125ba57600080fd5b50813567ffffffffffffffff8111156125d257600080fd5b6020830191508360208285010111156125ea57600080fd5b9250929050565b60008060006040848603121561260657600080fd5b83359250602084013567ffffffffffffffff81111561262457600080fd5b612630868287016125a8565b9497909650939450505050565b60008060006040848603121561265257600080fd5b83359250602084013567ffffffffffffffff8082111561267157600080fd5b818601915086601f83011261268557600080fd5b81358181111561269457600080fd5b8760208260051b85010111156126a957600080fd5b6020830194508093505050509250925092565b600080602083850312156126cf57600080fd5b823567ffffffffffffffff8111156126e657600080fd5b6126f2858286016125a8565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b8181101561273f5783516001600160a01b03168352928401929184019160010161271a565b50909695505050505050565b6000815180845260005b8181101561277157602081850181015186830182015201612755565b81811115612783576000602083870101525b50601f01601f19169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b848110156127e357601f198684030189526127d183835161274b565b988401989250908301906001016127b5565b5090979650505050505050565b83815282602082015260606040820152600061280f6060830184612798565b95945050505050565b6000806000806040858703121561282e57600080fd5b843567ffffffffffffffff8082111561284657600080fd5b612852888389016125a8565b9096509450602087013591508082111561286b57600080fd5b50612878878288016125a8565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b600281106128b857634e487b7160e01b600052602160045260246000fd5b9052565b6020815260008251606060208401526128d8608084018261274b565b905060018060a01b03602085015116604084015260408401516128fe606085018261289a565b509392505050565b60006020828403121561291857600080fd5b81356001600160a01b038116811461292f57600080fd5b9392505050565b60208152600061292f6020830184612798565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561297157600080fd5b813567ffffffffffffffff8082111561298957600080fd5b818401915084601f83011261299d57600080fd5b8135818111156129af576129af612949565b604051601f8201601f19908116603f011681019083821181831017156129d7576129d7612949565b816040528281528760208487010111156129f057600080fd5b826020860160208301376000928101602001929092525095945050505050565b606081526000612a23606083018661274b565b6001600160a01b03851660208401529050612a41604083018461289a565b949350505050565b848152836020820152608060408201526000612a68608083018561274b565b82810360608401526104aa8185612798565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612aa757600080fd5b83018035915067ffffffffffffffff821115612ac257600080fd5b6020019150368190038213156125ea57600080fd5b600060208284031215612ae957600080fd5b8151801515811461292f57600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612b2357612b23612af9565b5060010190565b600181811c90821680612b3e57607f821691505b60208210811415612b5f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354612b7381612b2a565b60018281168015612b8b5760018114612b9c57612bcb565b60ff19841687528287019450612bcb565b8760005260208060002060005b85811015612bc25781548a820152908401908201612ba9565b50505082870194505b50929695505050505050565b8183823760009101908152919050565b60008219821115612bfa57612bfa612af9565b500190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006060820186835260208681850152606060408501528185835260808501905060808660051b86010192508660005b87811015612cc757868503607f190183528135368a9003601e19018112612c7e57600080fd5b8901803567ffffffffffffffff811115612c9757600080fd5b8036038b1315612ca657600080fd5b612cb38782888501612bff565b965050509183019190830190600101612c58565b50929998505050505050505050565b60208082526025908201527f636f6e74726163742063616c6c206973206e6f74207374616b696e6720736c616040820152647368696e6760d81b606082015260800190565b600082821015612d2d57612d2d612af9565b500390565b600060ff821660ff84168060ff03821115612d4f57612d4f612af9565b019392505050565b84815260006020606081840152612d72606084018688612bff565b83810360408501528085548083528383019150838160051b8401016000888152858120815b84811015612e2957601f19878503018652828254612db481612b2a565b80875260018281168015612dcf5760018114612de357612e12565b60ff198416898e0152604089019450612e12565b8688528c8820885b84811015612e0a5781548f828d01015283820191508e81019050612deb565b8a018e019550505b50988b019892965050509190910190600101612d97565b50919c9b505050505050505050505050565b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220c1fe39da9086ceea54804947accada4e29bc357d3134d4217f775e30b95f259364736f6c63430008090033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101735760003560e01c80637a952c11116100de578063b57388d311610097578063e46a636811610071578063e46a636814610338578063f2fde38b14610366578063fcca559214610379578063fd3eb81f1461039157600080fd5b8063b57388d3146102ff578063bcbc5fc614610312578063cf4c8a7b1461032557600080fd5b80637a952c11146102935780638129fc1c146102a65780638a51d8b4146102ae5780638da5cb5b146102b757806395f645bc146102c8578063b3bd9ac4146102dd57600080fd5b8063429ec49c11610130578063429ec49c1461021f5780634679b366146102325780634866e2e01461024557806354bbb9141461025857806368fe7d2314610278578063715018a61461028b57600080fd5b806319045a25146101785780631a47931b146101a8578063254ff981146101bd5780632cd00d53146101d05780633231a7f0146101e5578063404a698614610208575b600080fd5b61018b6101863660046125f1565b6103a4565b6040516001600160a01b0390911681526020015b60405180910390f35b6101bb6101b636600461263d565b6104b5565b005b6101bb6101cb3660046126bc565b61098d565b6101d8610a06565b60405161019f91906126fe565b6101f86101f33660046125f1565b610bf4565b604051901515815260200161019f565b610210610c20565b60405161019f939291906127f0565b6101bb61022d3660046126bc565b610d17565b6101bb610240366004612818565b610d55565b6101f86102533660046126bc565b61112b565b61026b6102663660046126bc565b61115b565b60405161019f91906128bc565b6101f8610286366004612906565b611288565b6101bb611370565b6101bb6102a13660046126bc565b611384565b6101bb611582565b609e54156101f8565b6033546001600160a01b031661018b565b6102d06116a2565b60405161019f9190612936565b6102f06102eb36600461295f565b61177b565b60405161019f93929190612a10565b6101f861030d366004612906565b611840565b6101f86103203660046126bc565b6118bb565b609c5461018b906001600160a01b031681565b6101f861034636600461295f565b805160208183018101805160a38252928201919093012091525460ff1681565b6101bb610374366004612906565b611902565b610381611978565b60405161019f9493929190612a49565b6101bb61039f366004612906565b611af5565b6000806000806103e986868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8092505050565b92509250925060006001888386866040516000815260200160405260405161042d949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561044f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166104aa5760405162461bcd60e51b815260206004820152601060248201526f1958dc9958dbdd995c8819985a5b195960821b60448201526064015b60405180910390fd5b979650505050505050565b6104bd611c09565b8061050a5760405162461bcd60e51b815260206004820152601960248201527f6261746368207075626c6963206b657920697320656d7074790000000000000060448201526064016104a1565b8083106105655760405162461bcd60e51b815260206004820152602360248201527f7468726573686f6c64206d757374206c657373207468616e20747373206d656d6044820152623132b960e91b60648201526084016104a1565b60005b818110156106cd5760006105d384848481811061058757610587612a7a565b90506020028101906105999190612a90565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6392505050565b609c5460405163522c209d60e11b81526001600160a01b03808416600483015292935091169063a458413a90602401602060405180830381600087803b15801561061c57600080fd5b505af1158015610630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106549190612ad7565b6106ba5760405162461bcd60e51b815260206004820152603160248201527f6261746368207075626c6963206b657973206861732061206e6f6465202c636160448201527037103737ba1031329037b832b930ba37b960791b60648201526084016104a1565b50806106c581612b0f565b915050610568565b50609e54156108295760005b609e5481101561081c5760a160a0609e83815481106106fa576106fa612a7a565b906000526020600020016040516107119190612b65565b90815260405190819003602001812061072991612b65565b90815260200160405180910390206000905560a0609e828154811061075057610750612a7a565b906000526020600020016040516107679190612b65565b9081526020016040518091039020600061078191906123ab565b60a2609e828154811061079657610796612a7a565b906000526020600020016040516107ad9190612b65565b908152604051908190036020019020805460ff19169055609e805460a39190839081106107dc576107dc612a7a565b906000526020600020016040516107f39190612b65565b908152604051908190036020019020805460ff191690558061081481612b0f565b9150506106d9565b50610829609e60006123e5565b60005b8181101561093757609e83838381811061084857610848612a7a565b905060200281019061085a9190612a90565b82546001810184556000938452602090932061087893019190612403565b50600160a384848481811061088f5761088f612a7a565b90506020028101906108a19190612a90565b6040516108af929190612bd7565b908152604051908190036020019020805491151560ff19909216919091179055600060a28484848181106108e5576108e5612a7a565b90506020028101906108f79190612a90565b604051610905929190612bd7565b908152604051908190036020019020805491151560ff199092169190911790558061092f81612b0f565b91505061082c565b50609b839055609a547ffa26843b7ced045dd12994ee0e73c6f0904c3a4608bce58ae304d606035b079e9061096d906001612be7565b8484846040516109809493929190612c28565b60405180910390a1505050565b609c546001600160a01b031633146109b75760405162461bcd60e51b81526004016104a190612cd6565b6001609f83836040516109cb929190612bd7565b908152602001604051809103902060010160146101000a81548160ff021916908360018111156109fd576109fd612884565b02179055505050565b60606000805b609d54811015610a9a576000609f609d8381548110610a2d57610a2d612a7a565b90600052602060002001604051610a449190612b65565b908152602001604051809103902060010160149054906101000a900460ff166001811115610a7457610a74612884565b1415610a885781610a8481612b0f565b9250505b80610a9281612b0f565b915050610a0c565b5060008167ffffffffffffffff811115610ab657610ab6612949565b604051908082528060200260200182016040528015610adf578160200160208202803683370190505b5090506000805b609d54811015610beb576000609f609d8381548110610b0757610b07612a7a565b90600052602060002001604051610b1e9190612b65565b908152602001604051809103902060010160149054906101000a900460ff166001811115610b4e57610b4e612884565b1415610bd957609f609d8281548110610b6957610b69612a7a565b90600052602060002001604051610b809190612b65565b9081526040519081900360200190206001015483516001600160a01b0390911690849084908110610bb357610bb3612a7a565b6001600160a01b039092166020928302919091019091015281610bd581612b0f565b9250505b80610be381612b0f565b915050610ae6565b50909392505050565b6098546000906001600160a01b0316610c0e8585856103a4565b6001600160a01b031614949350505050565b6000806060609a546001610c349190612be7565b609b54609e80805480602002602001604051908101604052809291908181526020016000905b82821015610d06578382906000526020600020018054610c7990612b2a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca590612b2a565b8015610cf25780601f10610cc757610100808354040283529160200191610cf2565b820191906000526020600020905b815481529060010190602001808311610cd557829003601f168201915b505050505081526020019060010190610c5a565b505050509050925092509250909192565b609c546001600160a01b03163314610d415760405162461bcd60e51b81526004016104a190612cd6565b6000609f83836040516109cb929190612bd7565b60a38484604051610d67929190612bd7565b9081526040519081900360200190205460ff16610dd75760405162461bcd60e51b815260206004820152602860248201527f796f7572207075626c6963206b6579206973206e6f7420696e20496e416374696044820152673b32a6b2b6b132b960c11b60648201526084016104a1565b610e1684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6392505050565b6001600160a01b0316336001600160a01b031614610e6d5760405162461bcd60e51b81526020600482015260146024820152730e0eac4d8d2c640d6caf240dcdee840dac2e8c6d60631b60448201526064016104a1565b60408114610ebd5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642067726f75705075626c69634b6579206c656e67746800000060448201526064016104a1565b60a28484604051610ecf929190612bd7565b9081526040519081900360200190205460ff16610f1b57600160a28585604051610efa929190612bd7565b908152604051908190036020019020805491151560ff199092169190911790555b61100360a08585604051610f30929190612bd7565b90815260200160405180910390208054610f4990612b2a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7590612b2a565b8015610fc25780601f10610f9757610100808354040283529160200191610fc2565b820191906000526020600020905b815481529060010190602001808311610fa557829003601f168201915b505050505083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cc292505050565b6110f157600160a1838360405161101b929190612bd7565b908152602001604051809103902060008282546110389190612be7565b909155505060405160a0906110509086908690612bd7565b9081526020016040518091039020805461106990612b2a565b1590506110c157600160a160a08686604051611086929190612bd7565b90815260405190819003602001812061109e91612b65565b908152602001604051809103902060008282546110bb9190612d1b565b90915550505b818160a086866040516110d5929190612bd7565b9081526040519081900360200190206110ef929091612403565b505b609e5460405160a1906111079085908590612bd7565b90815260200160405180910390205410611125576111258282611d54565b50505050565b600060a3838360405161113f929190612bd7565b9081526040519081900360200190205460ff1690505b92915050565b61117c60408051606080820183528152600060208201819052909182015290565b609f838360405161118e929190612bd7565b90815260200160405180910390206040518060600160405290816000820180546111b790612b2a565b80601f01602080910402602001604051908101604052809291908181526020018280546111e390612b2a565b80156112305780601f1061120557610100808354040283529160200191611230565b820191906000526020600020905b81548152906001019060200180831161121357829003601f168201915b50505091835250506001828101546001600160a01b0381166020840152604090920191600160a01b900460ff169081111561126d5761126d612884565b600181111561127e5761127e612884565b9052509392505050565b6000805b609d54811015611367576000609f609d83815481106112ad576112ad612a7a565b906000526020600020016040516112c49190612b65565b908152602001604051809103902060010160149054906101000a900460ff1660018111156112f4576112f4612884565b141561135557609f609d828154811061130f5761130f612a7a565b906000526020600020016040516113269190612b65565b908152604051908190036020019020600101546001600160a01b03848116911614156113555750600192915050565b8061135f81612b0f565b91505061128c565b50600092915050565b611378611c09565b611382600061226e565b565b61138c611c09565b60995461139a906001612be7565b609d54116114275760405162461bcd60e51b815260206004820152604e60248201527f54737347726f75704d616e616765722072656d6f76654d656d6265723a20616360448201527f74697665206d656d62657273206d757374206d6f7265207468616e207468726560648201526d73686f6c6420706c7573206f6e6560901b608482015260a4016104a1565b60005b609d5481101561153e57611519609d828154811061144a5761144a612a7a565b90600052602060002001805461145f90612b2a565b80601f016020809104026020016040519081016040528092919081815260200182805461148b90612b2a565b80156114d85780601f106114ad576101008083540402835291602001916114d8565b820191906000526020600020905b8154815290600101906020018083116114bb57829003601f168201915b505050505084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cc292505050565b1561152c57611527816122c0565b61153e565b8061153681612b0f565b91505061142a565b50609f8282604051611551929190612bd7565b908152604051908190036020019020600061156c82826123ab565b5060010180546001600160a81b03191690555050565b600054610100900460ff16158080156115a25750600054600160ff909116105b806115bc5750303b1580156115bc575060005460ff166001145b61161f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a1565b6000805460ff191660011790558015611642576000805461ff0019166101001790555b61164a612351565b6000609a8190556099819055609b55801561169f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6060609d805480602002602001604051908101604052809291908181526020016000905b828210156117725783829060005260206000200180546116e590612b2a565b80601f016020809104026020016040519081016040528092919081815260200182805461171190612b2a565b801561175e5780601f106117335761010080835404028352916020019161175e565b820191906000526020600020905b81548152906001019060200180831161174157829003601f168201915b5050505050815260200190600101906116c6565b50505050905090565b8051602081830181018051609f825292820191909301209152805481906117a190612b2a565b80601f01602080910402602001604051908101604052809291908181526020018280546117cd90612b2a565b801561181a5780601f106117ef5761010080835404028352916020019161181a565b820191906000526020600020905b8154815290600101906020018083116117fd57829003601f168201915b505050600190930154919250506001600160a01b0381169060ff600160a01b9091041683565b6000805b609d5481101561136757609f609d828154811061186357611863612a7a565b9060005260206000200160405161187a9190612b65565b908152604051908190036020019020600101546001600160a01b03848116911614156118a95750600192915050565b806118b381612b0f565b915050611844565b600080609f84846040516118d0929190612bd7565b90815260405190819003602001902080546118ea90612b2a565b905011156118fa57506001611155565b506000611155565b61190a611c09565b6001600160a01b03811661196f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104a1565b61169f8161226e565b600080606080609a546099546097609d81805461199490612b2a565b80601f01602080910402602001604051908101604052809291908181526020018280546119c090612b2a565b8015611a0d5780601f106119e257610100808354040283529160200191611a0d565b820191906000526020600020905b8154815290600101906020018083116119f057829003601f168201915b5050505050915080805480602002602001604051908101604052809291908181526020016000905b82821015611ae1578382906000526020600020018054611a5490612b2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8090612b2a565b8015611acd5780601f10611aa257610100808354040283529160200191611acd565b820191906000526020600020905b815481529060010190602001808311611ab057829003601f168201915b505050505081526020019060010190611a35565b505050509050935093509350935090919293565b611afd611c09565b6001600160a01b038116611b5e5760405162461bcd60e51b815260206004820152602260248201527f706172616d205f6164647265737320697320746865207a65726f206164647265604482015261737360f01b60648201526084016104a1565b609c80546001600160a01b0319166001600160a01b0392909216919091179055565b60008060008351604114611bd65760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016104a1565b50505060208101516040820151606083015160001a601b811015611c0257611bff601b82612d32565b90505b9193909250565b6033546001600160a01b031633146113825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a1565b60008151604014611cb65760405162461bcd60e51b815260206004820152601f60248201527f7075626c6963206b6579206c656e677468206d7573742036342062797465730060448201526064016104a1565b50805160209091012090565b60008151835114611cd557506000611155565b60005b8351811015611d4a57828181518110611cf357611cf3612a7a565b602001015160f81c60f81b6001600160f81b031916848281518110611d1a57611d1a612a7a565b01602001516001600160f81b03191614611d38576000915050611155565b80611d4281612b0f565b915050611cd8565b5060019392505050565b609d5415611de15760005b609d54811015611dd457609f609d8281548110611d7e57611d7e612a7a565b90600052602060002001604051611d959190612b65565b9081526040519081900360200190206000611db082826123ab565b5060010180546001600160a81b031916905580611dcc81612b0f565b915050611d5f565b50611de1609d60006123e5565b60005b609e5481101561219b57609d609e8281548110611e0357611e03612a7a565b600091825260208083208454600181018655948452922091018054919092019190611e2d90612b2a565b611e38929190612487565b506040518060600160405280609e8381548110611e5757611e57612a7a565b906000526020600020018054611e6c90612b2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9890612b2a565b8015611ee55780601f10611eba57610100808354040283529160200191611ee5565b820191906000526020600020905b815481529060010190602001808311611ec857829003601f168201915b50505050508152602001611f9d609e8481548110611f0557611f05612a7a565b906000526020600020018054611f1a90612b2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4690612b2a565b8015611f935780601f10611f6857610100808354040283529160200191611f93565b820191906000526020600020905b815481529060010190602001808311611f7657829003601f168201915b5050505050611c63565b6001600160a01b031681526020016000815250609f609e8381548110611fc557611fc5612a7a565b90600052602060002001604051611fdc9190612b65565b90815260200160405180910390206000820151816000019080519060200190612006929190612502565b506020820151600180830180546001600160a01b039093166001600160a01b031984168117825560408601519391926001600160a81b03199092161790600160a01b90849081111561205a5761205a612884565b021790555090505060a160a0609e838154811061207957612079612a7a565b906000526020600020016040516120909190612b65565b9081526040519081900360200181206120a891612b65565b90815260200160405180910390206000905560a0609e82815481106120cf576120cf612a7a565b906000526020600020016040516120e69190612b65565b9081526020016040518091039020600061210091906123ab565b60a2609e828154811061211557612115612a7a565b9060005260206000200160405161212c9190612b65565b908152604051908190036020019020805460ff19169055609e805460a391908390811061215b5761215b612a7a565b906000526020600020016040516121729190612b65565b908152604051908190036020019020805460ff191690558061219381612b0f565b915050611de4565b506121a8609e60006123e5565b6121b460978383612403565b506121f482828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6392505050565b609880546001600160a01b0319166001600160a01b0392909216919091179055609b54609955609a54612228906001612be7565b609a8190556040517f61c7922e50ad7ea3d35879a4a819ae97eb09b665f2113451d7ada7cb2b689b66916122629185908590609d90612d57565b60405180910390a15050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b609d80546122d090600190612d1b565b815481106122e0576122e0612a7a565b90600052602060002001609d82815481106122fd576122fd612a7a565b9060005260206000200190805461231390612b2a565b61231e929190612487565b50609d80548061233057612330612e3b565b60019003818190600052602060002001600061234c91906123ab565b905550565b600054610100900460ff166123785760405162461bcd60e51b81526004016104a190612e51565b611382600054610100900460ff166123a25760405162461bcd60e51b81526004016104a190612e51565b6113823361226e565b5080546123b790612b2a565b6000825580601f106123c7575050565b601f01602090049060005260206000209081019061169f9190612576565b508054600082559060005260206000209081019061169f919061258b565b82805461240f90612b2a565b90600052602060002090601f0160209004810192826124315760008555612477565b82601f1061244a5782800160ff19823516178555612477565b82800160010185558215612477579182015b8281111561247757823582559160200191906001019061245c565b50612483929150612576565b5090565b82805461249390612b2a565b90600052602060002090601f0160209004810192826124b55760008555612477565b82601f106124c65780548555612477565b8280016001018555821561247757600052602060002091601f016020900482015b828111156124775782548255916001019190600101906124e7565b82805461250e90612b2a565b90600052602060002090601f0160209004810192826125305760008555612477565b82601f1061254957805160ff1916838001178555612477565b82800160010185558215612477579182015b8281111561247757825182559160200191906001019061255b565b5b808211156124835760008155600101612577565b8082111561248357600061259f82826123ab565b5060010161258b565b60008083601f8401126125ba57600080fd5b50813567ffffffffffffffff8111156125d257600080fd5b6020830191508360208285010111156125ea57600080fd5b9250929050565b60008060006040848603121561260657600080fd5b83359250602084013567ffffffffffffffff81111561262457600080fd5b612630868287016125a8565b9497909650939450505050565b60008060006040848603121561265257600080fd5b83359250602084013567ffffffffffffffff8082111561267157600080fd5b818601915086601f83011261268557600080fd5b81358181111561269457600080fd5b8760208260051b85010111156126a957600080fd5b6020830194508093505050509250925092565b600080602083850312156126cf57600080fd5b823567ffffffffffffffff8111156126e657600080fd5b6126f2858286016125a8565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b8181101561273f5783516001600160a01b03168352928401929184019160010161271a565b50909695505050505050565b6000815180845260005b8181101561277157602081850181015186830182015201612755565b81811115612783576000602083870101525b50601f01601f19169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b848110156127e357601f198684030189526127d183835161274b565b988401989250908301906001016127b5565b5090979650505050505050565b83815282602082015260606040820152600061280f6060830184612798565b95945050505050565b6000806000806040858703121561282e57600080fd5b843567ffffffffffffffff8082111561284657600080fd5b612852888389016125a8565b9096509450602087013591508082111561286b57600080fd5b50612878878288016125a8565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b600281106128b857634e487b7160e01b600052602160045260246000fd5b9052565b6020815260008251606060208401526128d8608084018261274b565b905060018060a01b03602085015116604084015260408401516128fe606085018261289a565b509392505050565b60006020828403121561291857600080fd5b81356001600160a01b038116811461292f57600080fd5b9392505050565b60208152600061292f6020830184612798565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561297157600080fd5b813567ffffffffffffffff8082111561298957600080fd5b818401915084601f83011261299d57600080fd5b8135818111156129af576129af612949565b604051601f8201601f19908116603f011681019083821181831017156129d7576129d7612949565b816040528281528760208487010111156129f057600080fd5b826020860160208301376000928101602001929092525095945050505050565b606081526000612a23606083018661274b565b6001600160a01b03851660208401529050612a41604083018461289a565b949350505050565b848152836020820152608060408201526000612a68608083018561274b565b82810360608401526104aa8185612798565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612aa757600080fd5b83018035915067ffffffffffffffff821115612ac257600080fd5b6020019150368190038213156125ea57600080fd5b600060208284031215612ae957600080fd5b8151801515811461292f57600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612b2357612b23612af9565b5060010190565b600181811c90821680612b3e57607f821691505b60208210811415612b5f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354612b7381612b2a565b60018281168015612b8b5760018114612b9c57612bcb565b60ff19841687528287019450612bcb565b8760005260208060002060005b85811015612bc25781548a820152908401908201612ba9565b50505082870194505b50929695505050505050565b8183823760009101908152919050565b60008219821115612bfa57612bfa612af9565b500190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006060820186835260208681850152606060408501528185835260808501905060808660051b86010192508660005b87811015612cc757868503607f190183528135368a9003601e19018112612c7e57600080fd5b8901803567ffffffffffffffff811115612c9757600080fd5b8036038b1315612ca657600080fd5b612cb38782888501612bff565b965050509183019190830190600101612c58565b50929998505050505050505050565b60208082526025908201527f636f6e74726163742063616c6c206973206e6f74207374616b696e6720736c616040820152647368696e6760d81b606082015260800190565b600082821015612d2d57612d2d612af9565b500390565b600060ff821660ff84168060ff03821115612d4f57612d4f612af9565b019392505050565b84815260006020606081840152612d72606084018688612bff565b83810360408501528085548083528383019150838160051b8401016000888152858120815b84811015612e2957601f19878503018652828254612db481612b2a565b80875260018281168015612dcf5760018114612de357612e12565b60ff198416898e0152604089019450612e12565b8688528c8820885b84811015612e0a5781548f828d01015283820191508e81019050612deb565b8a018e019550505b50988b019892965050509190910190600101612d97565b50919c9b505050505050505050505050565b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220c1fe39da9086ceea54804947accada4e29bc357d3134d4217f775e30b95f259364736f6c63430008090033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 216,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 219,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 2492,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "__gap",
        "offset": 0,
        "slot": "1",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 10,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "_owner",
        "offset": 0,
        "slot": "51",
        "type": "t_address"
      },
      {
        "astId": 130,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "__gap",
        "offset": 0,
        "slot": "52",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 501,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "_status",
        "offset": 0,
        "slot": "101",
        "type": "t_uint256"
      },
      {
        "astId": 545,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "__gap",
        "offset": 0,
        "slot": "102",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 40760,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "confirmGroupPublicKey",
        "offset": 0,
        "slot": "151",
        "type": "t_bytes_storage"
      },
      {
        "astId": 40762,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "confirmGroupAddress",
        "offset": 0,
        "slot": "152",
        "type": "t_address"
      },
      {
        "astId": 40764,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "threshold",
        "offset": 0,
        "slot": "153",
        "type": "t_uint256"
      },
      {
        "astId": 40766,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "gRoundId",
        "offset": 0,
        "slot": "154",
        "type": "t_uint256"
      },
      {
        "astId": 40768,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "tempThreshold",
        "offset": 0,
        "slot": "155",
        "type": "t_uint256"
      },
      {
        "astId": 40770,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "stakingSlash",
        "offset": 0,
        "slot": "156",
        "type": "t_address"
      },
      {
        "astId": 40773,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "activeTssMembers",
        "offset": 0,
        "slot": "157",
        "type": "t_array(t_bytes_storage)dyn_storage"
      },
      {
        "astId": 40776,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "inActiveTssMembers",
        "offset": 0,
        "slot": "158",
        "type": "t_array(t_bytes_storage)dyn_storage"
      },
      {
        "astId": 40781,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "tssActiveMemberInfo",
        "offset": 0,
        "slot": "159",
        "type": "t_mapping(t_bytes_memory_ptr,t_struct(TssMember)40494_storage)"
      },
      {
        "astId": 40785,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "_memberGroupKey",
        "offset": 0,
        "slot": "160",
        "type": "t_mapping(t_bytes_memory_ptr,t_bytes_storage)"
      },
      {
        "astId": 40789,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "_groupKeyCounter",
        "offset": 0,
        "slot": "161",
        "type": "t_mapping(t_bytes_memory_ptr,t_uint256)"
      },
      {
        "astId": 40793,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "_isSubmitGroupKey",
        "offset": 0,
        "slot": "162",
        "type": "t_mapping(t_bytes_memory_ptr,t_bool)"
      },
      {
        "astId": 40797,
        "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
        "label": "isInActiveMember",
        "offset": 0,
        "slot": "163",
        "type": "t_mapping(t_bytes_memory_ptr,t_bool)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_bytes_storage)dyn_storage": {
        "base": "t_bytes_storage",
        "encoding": "dynamic_array",
        "label": "bytes[]",
        "numberOfBytes": "32"
      },
      "t_array(t_uint256)49_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[49]",
        "numberOfBytes": "1568"
      },
      "t_array(t_uint256)50_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[50]",
        "numberOfBytes": "1600"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes_memory_ptr": {
        "encoding": "bytes",
        "label": "bytes",
        "numberOfBytes": "32"
      },
      "t_bytes_storage": {
        "encoding": "bytes",
        "label": "bytes",
        "numberOfBytes": "32"
      },
      "t_enum(MemberStatus)40486": {
        "encoding": "inplace",
        "label": "enum ITssGroupManager.MemberStatus",
        "numberOfBytes": "1"
      },
      "t_mapping(t_bytes_memory_ptr,t_bool)": {
        "encoding": "mapping",
        "key": "t_bytes_memory_ptr",
        "label": "mapping(bytes => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_bytes_memory_ptr,t_bytes_storage)": {
        "encoding": "mapping",
        "key": "t_bytes_memory_ptr",
        "label": "mapping(bytes => bytes)",
        "numberOfBytes": "32",
        "value": "t_bytes_storage"
      },
      "t_mapping(t_bytes_memory_ptr,t_struct(TssMember)40494_storage)": {
        "encoding": "mapping",
        "key": "t_bytes_memory_ptr",
        "label": "mapping(bytes => struct ITssGroupManager.TssMember)",
        "numberOfBytes": "32",
        "value": "t_struct(TssMember)40494_storage"
      },
      "t_mapping(t_bytes_memory_ptr,t_uint256)": {
        "encoding": "mapping",
        "key": "t_bytes_memory_ptr",
        "label": "mapping(bytes => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_struct(TssMember)40494_storage": {
        "encoding": "inplace",
        "label": "struct ITssGroupManager.TssMember",
        "members": [
          {
            "astId": 40488,
            "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
            "label": "publicKey",
            "offset": 0,
            "slot": "0",
            "type": "t_bytes_storage"
          },
          {
            "astId": 40490,
            "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
            "label": "nodeAddress",
            "offset": 0,
            "slot": "1",
            "type": "t_address"
          },
          {
            "astId": 40493,
            "contract": "contracts/L1/tss/TssGroupManager.sol:TssGroupManager",
            "label": "status",
            "offset": 20,
            "slot": "1",
            "type": "t_enum(MemberStatus)40486"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}